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