opencl: fail gracefully if opencl devices are not available
Also for unsupported GPUs.
This commit is contained in:
parent
c971a1885d
commit
b25a4caaf4
1 changed files with 15 additions and 5 deletions
|
@ -187,7 +187,7 @@ struct ggml_backend_opencl_context {
|
||||||
#endif // GGML_OPENCL_USE_ADRENO_KERNELS
|
#endif // GGML_OPENCL_USE_ADRENO_KERNELS
|
||||||
};
|
};
|
||||||
|
|
||||||
static ggml_backend_device g_ggml_backend_opencl_device;
|
static ggml_backend_device g_ggml_backend_opencl_device;
|
||||||
static ggml_backend_opencl_device_context g_ggml_ctx_dev_main {
|
static ggml_backend_opencl_device_context g_ggml_ctx_dev_main {
|
||||||
/*.platform =*/ nullptr,
|
/*.platform =*/ nullptr,
|
||||||
/*.platform_nane =*/ "",
|
/*.platform_nane =*/ "",
|
||||||
|
@ -195,6 +195,8 @@ static ggml_backend_opencl_device_context g_ggml_ctx_dev_main {
|
||||||
/*.device_name =*/ "",
|
/*.device_name =*/ "",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static int ggml_backend_opencl_n_devices = 0;
|
||||||
|
|
||||||
// Profiling
|
// Profiling
|
||||||
#ifdef GGML_OPENCL_PROFILING
|
#ifdef GGML_OPENCL_PROFILING
|
||||||
struct ProfilingInfo {
|
struct ProfilingInfo {
|
||||||
|
@ -270,6 +272,7 @@ static ggml_backend_opencl_context * ggml_cl2_init(ggml_backend_dev_t dev) {
|
||||||
|
|
||||||
initialized = true;
|
initialized = true;
|
||||||
backend_ctx = new ggml_backend_opencl_context();
|
backend_ctx = new ggml_backend_opencl_context();
|
||||||
|
backend_ctx->gpu_family = GPU_FAMILY::UNKNOWN;
|
||||||
|
|
||||||
cl_int err;
|
cl_int err;
|
||||||
|
|
||||||
|
@ -305,7 +308,10 @@ static ggml_backend_opencl_context * ggml_cl2_init(ggml_backend_dev_t dev) {
|
||||||
struct cl_device * default_device = NULL;
|
struct cl_device * default_device = NULL;
|
||||||
|
|
||||||
cl_platform_id platform_ids[NPLAT];
|
cl_platform_id platform_ids[NPLAT];
|
||||||
CL_CHECK(clGetPlatformIDs(NPLAT, platform_ids, &n_platforms));
|
if (clGetPlatformIDs(NPLAT, platform_ids, &n_platforms) != CL_SUCCESS) {
|
||||||
|
GGML_LOG_ERROR("ggml_opencl: plaform IDs not available.\n");
|
||||||
|
return backend_ctx;
|
||||||
|
}
|
||||||
|
|
||||||
for (unsigned i = 0; i < n_platforms; i++) {
|
for (unsigned i = 0; i < n_platforms; i++) {
|
||||||
struct cl_platform * p = &platforms[i];
|
struct cl_platform * p = &platforms[i];
|
||||||
|
@ -344,7 +350,7 @@ static ggml_backend_opencl_context * ggml_cl2_init(ggml_backend_dev_t dev) {
|
||||||
|
|
||||||
if (n_devices == 0) {
|
if (n_devices == 0) {
|
||||||
GGML_LOG_ERROR("ggml_opencl: could find any OpenCL devices.\n");
|
GGML_LOG_ERROR("ggml_opencl: could find any OpenCL devices.\n");
|
||||||
exit(1);
|
return backend_ctx;
|
||||||
}
|
}
|
||||||
|
|
||||||
char * user_platform_string = getenv("GGML_OPENCL_PLATFORM");
|
char * user_platform_string = getenv("GGML_OPENCL_PLATFORM");
|
||||||
|
@ -453,7 +459,8 @@ static ggml_backend_opencl_context * ggml_cl2_init(ggml_backend_dev_t dev) {
|
||||||
backend_ctx->gpu_family = GPU_FAMILY::INTEL;
|
backend_ctx->gpu_family = GPU_FAMILY::INTEL;
|
||||||
} else {
|
} else {
|
||||||
GGML_LOG_ERROR("Unknown GPU: %s\n", default_device->name);
|
GGML_LOG_ERROR("Unknown GPU: %s\n", default_device->name);
|
||||||
exit(1);
|
backend_ctx->gpu_family = GPU_FAMILY::UNKNOWN;
|
||||||
|
return backend_ctx;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Populate backend device name
|
// Populate backend device name
|
||||||
|
@ -758,6 +765,9 @@ static ggml_backend_opencl_context * ggml_cl2_init(ggml_backend_dev_t dev) {
|
||||||
CL_CHECK((backend_ctx->B_d_max = clCreateBuffer(context, 0, max_B_d_bytes, NULL, &err), err));
|
CL_CHECK((backend_ctx->B_d_max = clCreateBuffer(context, 0, max_B_d_bytes, NULL, &err), err));
|
||||||
#endif // GGML_OPENCL_USE_ADRENO_KERNELS
|
#endif // GGML_OPENCL_USE_ADRENO_KERNELS
|
||||||
|
|
||||||
|
// For now we support a single devices
|
||||||
|
ggml_backend_opencl_n_devices = 1;
|
||||||
|
|
||||||
return backend_ctx;
|
return backend_ctx;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1728,7 +1738,7 @@ static const char * ggml_backend_opencl_reg_get_name(ggml_backend_reg_t reg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static size_t ggml_backend_opencl_reg_device_count(ggml_backend_reg_t reg) {
|
static size_t ggml_backend_opencl_reg_device_count(ggml_backend_reg_t reg) {
|
||||||
return 1;
|
return ggml_backend_opencl_n_devices;
|
||||||
|
|
||||||
GGML_UNUSED(reg);
|
GGML_UNUSED(reg);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue