@@ -441,10 +441,32 @@ static ggml_backend_opencl_context * ggml_cl2_init(ggml_backend_dev_t dev) {
441441 dev_ctx->device = default_device->id ;
442442 backend_ctx->device = default_device->id ;
443443
444+ // A local ref of cl_device_id for convenience
445+ cl_device_id device = backend_ctx->device ;
446+
447+ // Check device OpenCL version, OpenCL 2.0 or above is required
448+ size_t device_ver_str_size;
449+ clGetDeviceInfo (device, CL_DEVICE_VERSION, 0 , NULL , &device_ver_str_size);
450+ char *device_ver_buffer = (char *)alloca (device_ver_str_size + 1 );
451+ clGetDeviceInfo (device, CL_DEVICE_VERSION, device_ver_str_size, device_ver_buffer, NULL );
452+ device_ver_buffer[device_ver_str_size] = ' \0 ' ;
453+ GGML_LOG_INFO (" ggml_opencl: device OpenCL version: %s\n " , device_ver_buffer);
454+
455+ if (strstr (device_ver_buffer, " OpenCL 2" ) == NULL &&
456+ strstr (device_ver_buffer, " OpenCL 3" ) == NULL ) {
457+ GGML_LOG_ERROR (" ggml_opencl: OpenCL 2.0 or above is required\n " );
458+ return backend_ctx;
459+ }
460+
444461 if (strstr (default_device->name , " Adreno" )) {
445462 backend_ctx->gpu_family = GPU_FAMILY::ADRENO;
446463 backend_ctx->adreno_gen = get_adreno_gpu_gen (default_device->name );
447464
465+ // we check the device version buffer if we cannot detect it from name
466+ if (backend_ctx->adreno_gen == ADRENO_GPU_GEN::ADRENO_UNKNOWN) {
467+ backend_ctx->adreno_gen = get_adreno_gpu_gen (device_ver_buffer);
468+ }
469+
448470 // Default wave size is 128, A8x uses 64.
449471 if (backend_ctx->adreno_gen == ADRENO_GPU_GEN::A8X) {
450472 backend_ctx->adreno_wave_size = 64 ;
@@ -479,23 +501,6 @@ static ggml_backend_opencl_context * ggml_cl2_init(ggml_backend_dev_t dev) {
479501 dev_ctx->device_name = default_device->name ;
480502 backend_ctx->device_name = default_device->name ;
481503
482- // A local ref of cl_device_id for convenience
483- cl_device_id device = backend_ctx->device ;
484-
485- // Check device OpenCL version, OpenCL 2.0 or above is required
486- size_t device_ver_str_size;
487- clGetDeviceInfo (device, CL_DEVICE_VERSION, 0 , NULL , &device_ver_str_size);
488- char *device_ver_buffer = (char *)alloca (device_ver_str_size + 1 );
489- clGetDeviceInfo (device, CL_DEVICE_VERSION, device_ver_str_size, device_ver_buffer, NULL );
490- device_ver_buffer[device_ver_str_size] = ' \0 ' ;
491- GGML_LOG_INFO (" ggml_opencl: device OpenCL version: %s\n " , device_ver_buffer);
492-
493- if (strstr (device_ver_buffer, " OpenCL 2" ) == NULL &&
494- strstr (device_ver_buffer, " OpenCL 3" ) == NULL ) {
495- GGML_LOG_ERROR (" ggml_opencl: OpenCL 2.0 or above is required\n " );
496- return backend_ctx;
497- }
498-
499504 // Check driver version
500505 size_t driver_version_str_size;
501506 clGetDeviceInfo (device, CL_DRIVER_VERSION, 0 , NULL , &driver_version_str_size);
0 commit comments