【问题标题】:GPU not found by OpenCLOpenCL 找不到 GPU
【发布时间】: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 == 1devices == NULL 没有任何意义。它说的是“给我一个 1 的列表”,但没有提供放置列表的任何地方。文档说:“如果devices 不为NULL,则num_entries 必须大于零。”;如果devices == NULLnum_entries 必须为零,这可能是隐含的(尽管模棱两可)。鉴于他声明该函数的目的是:“获取平台上可用的设备列表。”而不是简单的 count 设备,@987654345 的语义@ 似乎模棱两可。

标签: c opencl gpgpu amd-processor


【解决方案1】:

给定签名:

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);

这将使您在不检索实际列表的情况下进行计数。

【讨论】:

    猜你喜欢
    • 2015-06-04
    • 2016-02-26
    • 2016-05-06
    • 2019-06-15
    • 1970-01-01
    • 2018-10-08
    • 2013-12-03
    • 2018-05-08
    • 2021-04-06
    相关资源
    最近更新 更多