【发布时间】:2021-08-16 01:27:31
【问题描述】:
我是 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
但是,我的电脑的规格另有说明:
另外,当我在 AMD Radeon 软件中查找 GPU 规格时,我得到了以下信息:
显然,我的设备支持 OpenCL 2.0 版。最重要的是,我的 PC 中还安装了 PyOpenCL,它可以轻松检测 iGPU:
显然,问题出在 C 代码中,但我不知道在哪里!
以下是我的设备规格:
- 操作系统:Windows 10
- CPU:锐龙 3500u
- GPU:Radeon Vega 8 iGPU (gfx902)
我已经从here 安装了 OpenCL SDK。
【问题讨论】:
-
您只检查
clGetDeviceIDs()的成功 - 在它缩小错误发生之前知道clGetPlatformIDs()是否失败会很有用。如果clGetPlatformIDs()失败,clGetDeviceIDs()也会失败,但不一定是因为那个调用是错误的,而是前一个。 -
@Clifford 我之前检查过
clGetPlatformIDs()是否成功,它成功检测到我机器上安装的唯一OpenCL 平台。因为,我不想扔掉整个庞大的代码,所以我只提供了最少的可重现代码。 -
该信息以及演示它的代码应该在问题中。任何合理的人调试它都会检查,所以不包括它,你只是强迫这个必要的讨论,浪费时间和文字。
-
@Clifford 我已经编辑了我的帖子,并包含了信息和演示它的代码。
-
文档不清楚,但我认为拥有
num_entries == 1和devices == NULL没有任何意义。它说的是“给我一个 1 的列表”,但没有提供放置列表的任何地方。文档说:“如果devices不为NULL,则num_entries必须大于零。”;如果devices == NULL则num_entries必须为零,这可能是隐含的(尽管模棱两可)。鉴于他声明该函数的目的是:“获取平台上可用的设备列表。”而不是简单的 count 设备,@987654345 的语义@ 似乎模棱两可。
标签: c opencl gpgpu amd-processor