Skip to content

Commit dbaa360

Browse files
lhezmax-krasnyansky
authored andcommitted
opencl: check for various requirements, allow deprecated API
1 parent b41b6e6 commit dbaa360

File tree

1 file changed

+39
-0
lines changed

1 file changed

+39
-0
lines changed

ggml/src/ggml-opencl/ggml-opencl.cpp

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#define CL_TARGET_OPENCL_VERSION 220
2+
#define CL_USE_DEPRECATED_OPENCL_1_2_APIS
23

34
// suppress warnings in CL headers for GCC and Clang
45
#pragma GCC diagnostic ignored "-Woverlength-strings"
@@ -463,6 +464,14 @@ static ggml_backend_opencl_context * ggml_cl2_init(ggml_backend_dev_t dev) {
463464
return backend_ctx;
464465
}
465466

467+
#ifdef GGML_OPENCL_USE_ADRENO_KERNELS
468+
if (backend_ctx->gpu_family != GPU_FAMILY::ADRENO) {
469+
GGML_LOG_ERROR("ggml_opencl: Adreno-specific kernels should not be enabled for non-Adreno GPUs; "
470+
"run on an Adreno GPU or recompile with CMake option `-DGGML_OPENCL_USE_ADRENO_KERNELS=OFF`\n");
471+
return backend_ctx;
472+
}
473+
#endif
474+
466475
// Populate backend device name
467476
dev_ctx->platform_name = default_device->platform->name;
468477
dev_ctx->device_name = default_device->name;
@@ -471,6 +480,20 @@ static ggml_backend_opencl_context * ggml_cl2_init(ggml_backend_dev_t dev) {
471480
// A local ref of cl_device_id for convenience
472481
cl_device_id device = backend_ctx->device;
473482

483+
// Check device OpenCL version, OpenCL 2.0 or above is required
484+
size_t device_ver_str_size;
485+
clGetDeviceInfo(device, CL_DEVICE_VERSION, 0, NULL, &device_ver_str_size);
486+
char *device_ver_buffer = (char *)alloca(device_ver_str_size + 1);
487+
clGetDeviceInfo(device, CL_DEVICE_VERSION, device_ver_str_size, device_ver_buffer, NULL);
488+
device_ver_buffer[device_ver_str_size] = '\0';
489+
GGML_LOG_INFO("ggml_opencl: device OpenCL version: %s\n", device_ver_buffer);
490+
491+
if (strstr(device_ver_buffer, "OpenCL 2") == NULL &&
492+
strstr(device_ver_buffer, "OpenCL 3") == NULL) {
493+
GGML_LOG_ERROR("ggml_opencl: OpenCL 2.0 or above is required\n");
494+
return backend_ctx;
495+
}
496+
474497
// Check driver version
475498
size_t driver_version_str_size;
476499
clGetDeviceInfo(device, CL_DRIVER_VERSION, 0, NULL, &driver_version_str_size);
@@ -495,6 +518,22 @@ static ggml_backend_opencl_context * ggml_cl2_init(ggml_backend_dev_t dev) {
495518
backend_ctx->fp16_support = strstr(ext_buffer, "cl_khr_fp16") != NULL;
496519
GGML_LOG_INFO("ggml_opencl: device FP16 support: %s\n", backend_ctx->fp16_support ? "true" : "false");
497520

521+
// fp16 is required
522+
if (!backend_ctx->fp16_support) {
523+
GGML_LOG_ERROR("ggml_opencl: device does not support FP16\n");
524+
return backend_ctx;
525+
}
526+
527+
// If OpenCL 3.0 is supported, then check for cl_khr_subgroups, which becomes
528+
// optional in OpenCL 3.0 (cl_khr_subgroup is mandatory in OpenCL 2.x)
529+
if (strstr(device_ver_buffer, "OpenCL 3") &&
530+
strstr(ext_buffer, "cl_khr_subgroups") == NULL &&
531+
strstr(ext_buffer, "cl_intel_subgroups") == NULL) {
532+
GGML_LOG_ERROR("ggml_opencl: device does not support subgroups (cl_khr_subgroups or cl_intel_subgroups) "
533+
"(note that subgroups is an optional feature in OpenCL 3.0)\n");
534+
return backend_ctx;
535+
}
536+
498537
CL_CHECK(clGetDeviceInfo(device, CL_DEVICE_MEM_BASE_ADDR_ALIGN, sizeof(cl_uint), &backend_ctx->alignment, NULL));
499538
GGML_LOG_INFO("ggml_opencl: mem base addr align: %u\n", backend_ctx->alignment);
500539

0 commit comments

Comments
 (0)