OpenCL 找不到 GPU

GPU not found by OpenCL

我是 OpenCL 的新手,正在尝试获取有关我机器中已安装平台和设备的信息。我的 PC 上只安装了一个平台,OpenCL 很容易检测到它。以下 C 代码:

cl_uint num_platforms = 0;
cl_int err = 0;

err = clGetPlatformIDs(1, NULL, &num_platforms);
if(err != CL_SUCCESS) {
    printf("Failed to detect platforms");
    exit(1);
}

printf("Number of platforms detected: %u", num_platforms);

给出输出:

Number of platforms detected: 1

现在,当我尝试获取此平台中的设备时,OpenCL 未检测到它:

cl_platform_id platform;
cl_uint num_devices = 0;
cl_int err = 0;

err = clGetPlatformIDs(1, &platform, NULL); // Because only one platform is present
if(err != CL_SUCCESS) {
    printf("Failed to detect platforms");
    exit(1);
}

err = clGetDeviceIDs(platform, CL_DEVICE_TYPE_ALL, 1, NULL, &num_devices);
if(err != CL_SUCCESS) {
    printf("Failed to detect any devices");
    exit(1);
}

printf("Number of devices detected: %u", num_devices);

当我 运行 此代码时,我收到消息:

Failed to detect any devices

但是,我的 PC 的规格另有说明:

此外,当我在 AMD Radeon Software 中查找 GPU 规格时,我得到以下信息:

显然,我的设备支持 OpenCL 2.0 版。最重要的是,我还在我的电脑上安装了 PyOpenCL,它很容易检测到 iGPU:

很明显,问题出在C代码中,但我不知道在哪里!

以下是我设备的规格:

我已经从 here 安装了 OpenCL SDK。

鉴于签名:

cl_int clGetDeviceIDs( cl_platform_id platform,
                       cl_device_type device_type,
                       cl_uint num_entries,
                       cl_device_id *devices,
                       cl_uint *num_devices)

有:

err = clGetDeviceIDs(platform, CL_DEVICE_TYPE_ALL, 1, NULL, &num_devices);

您要求将长度为 1 的列表写入 NULL。文档没有出现明确排除这种组合,但它在语义上也没有多大意义。

如果您只是想检索 num_entries 中可用设备的数量,那么:

err = clGetDeviceIDs(platform, CL_DEVICE_TYPE_ALL, 0, NULL, &num_devices);

这将在不检索实际列表的情况下为您提供计数。