mirror of
				https://github.com/ggml-org/llama.cpp.git
				synced 2025-11-03 09:22:01 +00:00 
			
		
		
		
	ggml : add support for dynamic loading of backends (#10469)
* ggml : add support for dynamic loading of backends --------- Co-authored-by: Georgi Gerganov <ggerganov@gmail.com>
This commit is contained in:
		@@ -8,6 +8,8 @@
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    #define GGML_BACKEND_API_VERSION 1
 | 
			
		||||
 | 
			
		||||
    //
 | 
			
		||||
    // Backend buffer type
 | 
			
		||||
    //
 | 
			
		||||
@@ -63,20 +65,20 @@ extern "C" {
 | 
			
		||||
        enum ggml_backend_buffer_usage usage;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    ggml_backend_buffer_t ggml_backend_buffer_init(
 | 
			
		||||
    GGML_API ggml_backend_buffer_t ggml_backend_buffer_init(
 | 
			
		||||
                   ggml_backend_buffer_type_t buft,
 | 
			
		||||
            struct ggml_backend_buffer_i      iface,
 | 
			
		||||
                   void *                     context,
 | 
			
		||||
                   size_t                     size);
 | 
			
		||||
 | 
			
		||||
    // do not use directly, use ggml_backend_tensor_copy instead
 | 
			
		||||
    bool ggml_backend_buffer_copy_tensor(const struct ggml_tensor * src, struct ggml_tensor * dst);
 | 
			
		||||
    GGML_API bool ggml_backend_buffer_copy_tensor(const struct ggml_tensor * src, struct ggml_tensor * dst);
 | 
			
		||||
 | 
			
		||||
    // multi-buffer
 | 
			
		||||
    // buffer that contains a collection of buffers
 | 
			
		||||
    ggml_backend_buffer_t ggml_backend_multi_buffer_alloc_buffer(ggml_backend_buffer_t * buffers, size_t n_buffers);
 | 
			
		||||
    bool                  ggml_backend_buffer_is_multi_buffer(ggml_backend_buffer_t buffer);
 | 
			
		||||
    void                  ggml_backend_multi_buffer_set_usage(ggml_backend_buffer_t buffer, enum ggml_backend_buffer_usage usage);
 | 
			
		||||
    GGML_API ggml_backend_buffer_t ggml_backend_multi_buffer_alloc_buffer(ggml_backend_buffer_t * buffers, size_t n_buffers);
 | 
			
		||||
    GGML_API bool                  ggml_backend_buffer_is_multi_buffer(ggml_backend_buffer_t buffer);
 | 
			
		||||
    GGML_API void                  ggml_backend_multi_buffer_set_usage(ggml_backend_buffer_t buffer, enum ggml_backend_buffer_usage usage);
 | 
			
		||||
 | 
			
		||||
    //
 | 
			
		||||
    // Backend (stream)
 | 
			
		||||
@@ -199,17 +201,37 @@ extern "C" {
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    struct ggml_backend_reg {
 | 
			
		||||
        // int api_version; // TODO: for dynamic loading
 | 
			
		||||
        int api_version; // initialize to GGML_BACKEND_API_VERSION
 | 
			
		||||
        struct ggml_backend_reg_i iface;
 | 
			
		||||
        void * context;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    // Internal backend registry API
 | 
			
		||||
    void ggml_backend_register(ggml_backend_reg_t reg);
 | 
			
		||||
    void ggml_backend_device_register(ggml_backend_dev_t device);
 | 
			
		||||
    // TODO: backends can be loaded as a dynamic library, in which case it needs to export this function
 | 
			
		||||
    // typedef ggml_backend_register_t * (*ggml_backend_init)(void);
 | 
			
		||||
    GGML_API void ggml_backend_register(ggml_backend_reg_t reg);
 | 
			
		||||
    GGML_API void ggml_backend_device_register(ggml_backend_dev_t device);
 | 
			
		||||
 | 
			
		||||
    // Add backend dynamic loading support to the backend
 | 
			
		||||
    typedef ggml_backend_reg_t (*ggml_backend_init_t)(void);
 | 
			
		||||
 | 
			
		||||
    #ifdef GGML_BACKEND_DL
 | 
			
		||||
        #ifdef __cplusplus
 | 
			
		||||
        #    define GGML_BACKEND_DL_IMPL(reg_fn)                                 \
 | 
			
		||||
                extern "C" {                                                     \
 | 
			
		||||
                    GGML_BACKEND_API ggml_backend_reg_t ggml_backend_init(void); \
 | 
			
		||||
                }                                                                \
 | 
			
		||||
                ggml_backend_reg_t ggml_backend_init(void) {                     \
 | 
			
		||||
                    return reg_fn();                                             \
 | 
			
		||||
                }
 | 
			
		||||
        #else
 | 
			
		||||
        #    define GGML_BACKEND_DL_IMPL(reg_fn)                             \
 | 
			
		||||
                GGML_BACKEND_API ggml_backend_reg_t ggml_backend_init(void); \
 | 
			
		||||
                ggml_backend_reg_t ggml_backend_init(void) {                 \
 | 
			
		||||
                    return reg_fn();                                         \
 | 
			
		||||
                }
 | 
			
		||||
        #endif
 | 
			
		||||
    #else
 | 
			
		||||
    #    define GGML_BACKEND_DL_IMPL(reg_fn)
 | 
			
		||||
    #endif
 | 
			
		||||
 | 
			
		||||
#ifdef  __cplusplus
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user