OpenCL 在一个平台中只有一个设备

OpenCL only one device in a platform

我从头开始学习 OpenCL,对 platform = host + device 的想法感到困惑。在我的工作 PC 中检测到 2 个平台:平台 0 只有 CPU,平台 1 只有 NVIDIA GPU。 Detected platforms

这台 PC 实际上也有一个 Intel GPU,但我认为它不支持 OpenCL,所以这里没有显示。我的问题是:在 OpenCL 应用程序中有主机和设备。根据我从书中的理解,通常主机和设备来自一个平台。然后在我的 PC 中,我需要使用 CPU 或 NVIDIA GPU 作为 OpenCL 应用程序的主机和设备。这是真的吗?

我试着自己搜索了一下,有些答案确实帮助我对这个话题有了更多的了解,比如这个:What is a host in opencl?。但是我的搜索没有回答或确认关于主机和设备使用一个硬件。

我认为您在这里混淆了一些术语。

  • host 是在 CPU 本身上执行的常规程序。
  • 平台 由 OpenCL 驱动程序提供,代表一组设备和功能。
  • 设备是由平台提供的可用于 OpenCL 的底层硬件。

一个平台可能会提供多个不同的设备:例如,如果您安装了 Nvidia OpenCL 驱动程序,它会为每个支持的 GPU 提供一个 OpenCL 设备。同时,Intel 驱动程序提供 Intel CPU 作为 OpenCL 设备。

通常,您的程序流程如下所示:

  1. 使用 clGetPlatformIds
  2. 查找 OpenCL 平台
  3. 使用 clGetDeviceIds 查找您要使用的任何平台的 OpenCL 设备。
  4. 使用 clCreateContextclCreateProgram 等创建 OpenCL 上下文、程序、命令队列和内核
  5. 将必要的数据复制到缓冲区或内核参数。
  6. 使用clEnqueueNDRangeKernel在一台或多台设备上执行内核。
  7. 从缓冲区复制数据