1
1
#define CL_TARGET_OPENCL_VERSION 220
2
+ #define CL_USE_DEPRECATED_OPENCL_1_2_APIS
2
3
3
4
// suppress warnings in CL headers for GCC and Clang
4
5
#pragma GCC diagnostic ignored "-Woverlength-strings"
@@ -463,6 +464,14 @@ static ggml_backend_opencl_context * ggml_cl2_init(ggml_backend_dev_t dev) {
463
464
return backend_ctx;
464
465
}
465
466
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
+
466
475
// Populate backend device name
467
476
dev_ctx->platform_name = default_device->platform ->name ;
468
477
dev_ctx->device_name = default_device->name ;
@@ -471,6 +480,20 @@ static ggml_backend_opencl_context * ggml_cl2_init(ggml_backend_dev_t dev) {
471
480
// A local ref of cl_device_id for convenience
472
481
cl_device_id device = backend_ctx->device ;
473
482
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
+
474
497
// Check driver version
475
498
size_t driver_version_str_size;
476
499
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) {
495
518
backend_ctx->fp16_support = strstr (ext_buffer, " cl_khr_fp16" ) != NULL ;
496
519
GGML_LOG_INFO (" ggml_opencl: device FP16 support: %s\n " , backend_ctx->fp16_support ? " true" : " false" );
497
520
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
+
498
537
CL_CHECK (clGetDeviceInfo (device, CL_DEVICE_MEM_BASE_ADDR_ALIGN, sizeof (cl_uint), &backend_ctx->alignment , NULL ));
499
538
GGML_LOG_INFO (" ggml_opencl: mem base addr align: %u\n " , backend_ctx->alignment );
500
539
0 commit comments