为什么 OpenCL 找不到任何设备?

Why isn't OpenCL finding any devices?

我一直在摆弄 OpenCL,它似乎没有检测到我有一个设备可以在我的计算机中使用(我检测到)。

这是 dxdiag 的结果:

这是我的代码的第一部分,这里出现错误,检查我的机器上可用的设备数量。

cl_platform_id platform;
cl_uint num_devices;
cl_int err;

//get first platform
err = clGetPlatformIDs(1, &platform, NULL);

if (err < 0){
    perror("Couldn't find any platforms");
    exit(1);
}

//determine number of devices: ERROR RAISED AS RESULT OF THIS
err = clGetDeviceIDs(platform, CL_DEVICE_TYPE_ALL, 1, NULL, &num_devices);

if (err < 0){
    perror("Couldn't find any devices");
    exit(1);
}

这是这段代码的输出:

当我打印设备数量时,它 发现

printf("Found %d devices", num_devices);

每次都给出相同的数字:

请告诉我还有哪些其他信息可能有助于解决这个问题。

您不能确定它没有找到设备,因为您没有正确检查 return 值。有5个值(more, depending on your OpenCL version) that clGetDeviceIDs可以return:

  • CL_SUCCESS如果函数执行成功
  • CL_INVALID_PLATFORM 如果平台不是有效平台。
  • CL_INVALID_DEVICE_TYPE 如果 device_type 不是有效值。
  • CL_INVALID_VALUE 如果 num_entries 等于零且 device_type 不为 NULL,或者如果 num_devices 和 device_type 均为 NULL。
  • CL_DEVICE_NOT_FOUND 如果没有找到匹配 device_type 的 OpenCL 设备。

您应该对照那些值检查您的 err 值,以确保 CL_DEVICE_NOT_FOUND 确实如此。


同样,您应该使用 clGetPlatformIDsnum_platforms 值。您选择的平台可能没有有效的设备,但另一个平台有。

确保安装了 32 位和 64 位 opencl 驱动程序。如果你的应用是64位的,但只安装了32位的驱动,会导致找不到设备。

您可以使用我的应用程序检查已安装的设备: https://github.com/zbendefy/opencl-z/blob/master/opencl_z_1_1b.jar