* opencl: allow loading binary kernel * opencl: add libdl.h * ggml-backend-dl is in ggml, which depends backend libs, thus ggml-opencl cannot depend on ggml-backend-dl * add libdl.h to break cyclic dep * opencl: allow loading bin kernel lib * opencl: load `gemm_moe_mxfp4_f32_ns` from kernel lib if available * opencl: load q8_0 gemm from kernel lib * opencl: load q4_0 moe gemm from kernel lib * opencl: load q4_1 moe gemm from kernel lib * opencl: load q4_k moe gemm from kernel lib * opencl: always declare `get_adreno_bin_kernel_func_t` * opencl: rephrase message * opencl: fix for rebase * opencl: update doc
80 lines
1.6 KiB
C++
80 lines
1.6 KiB
C++
#pragma once
|
|
|
|
#ifdef _WIN32
|
|
# define WIN32_LEAN_AND_MEAN
|
|
# ifndef NOMINMAX
|
|
# define NOMINMAX
|
|
# endif
|
|
# include <windows.h>
|
|
# include <winevt.h>
|
|
#else
|
|
# include <dlfcn.h>
|
|
# include <unistd.h>
|
|
#endif
|
|
#include <filesystem>
|
|
|
|
namespace fs = std::filesystem;
|
|
|
|
#ifdef _WIN32
|
|
|
|
using dl_handle = std::remove_pointer_t<HMODULE>;
|
|
|
|
struct dl_handle_deleter {
|
|
void operator()(HMODULE handle) {
|
|
FreeLibrary(handle);
|
|
}
|
|
};
|
|
|
|
static inline dl_handle * dl_load_library(const fs::path & path) {
|
|
// suppress error dialogs for missing DLLs
|
|
DWORD old_mode = SetErrorMode(SEM_FAILCRITICALERRORS);
|
|
SetErrorMode(old_mode | SEM_FAILCRITICALERRORS);
|
|
|
|
HMODULE handle = LoadLibraryW(path.wstring().c_str());
|
|
|
|
SetErrorMode(old_mode);
|
|
|
|
return handle;
|
|
}
|
|
|
|
static inline void * dl_get_sym(dl_handle * handle, const char * name) {
|
|
DWORD old_mode = SetErrorMode(SEM_FAILCRITICALERRORS);
|
|
SetErrorMode(old_mode | SEM_FAILCRITICALERRORS);
|
|
|
|
void * p = (void *) GetProcAddress(handle, name);
|
|
|
|
SetErrorMode(old_mode);
|
|
|
|
return p;
|
|
}
|
|
|
|
static inline const char * dl_error() {
|
|
return "";
|
|
}
|
|
|
|
#else
|
|
|
|
using dl_handle = void;
|
|
|
|
struct dl_handle_deleter {
|
|
void operator()(void * handle) {
|
|
dlclose(handle);
|
|
}
|
|
};
|
|
|
|
static inline dl_handle * dl_load_library(const fs::path & path) {
|
|
dl_handle * handle = dlopen(path.string().c_str(), RTLD_NOW | RTLD_LOCAL);
|
|
return handle;
|
|
}
|
|
|
|
static inline void * dl_get_sym(dl_handle * handle, const char * name) {
|
|
return dlsym(handle, name);
|
|
}
|
|
|
|
static inline const char * dl_error() {
|
|
const char *rslt = dlerror();
|
|
return rslt != nullptr ? rslt : "";
|
|
}
|
|
|
|
#endif
|