OpenCL平台中只有一个设备

OpenCL平台中只有一个设备,opencl,host,gpu,Opencl,Host,Gpu,我从一开始就在学习OpenCL,对平台=主机+设备的想法感到困惑。在我的工作PC中,有2个平台被检测到:平台0只有CPU,平台1只有英伟达GPU。p> 这台电脑实际上也有一个英特尔GPU,但我假设它不支持OpenCL,所以这里没有显示。我的问题是:在OpenCL应用程序中,有主机和设备。根据我在书中的理解,通常主机和设备来自一个平台。然后在我的PC中,我需要使用CPU或英伟达GPU作为OpenCL应用程序的主机和设备。这是真的吗 我试着自己搜索,一些答案确实帮助我更好地理解这个话题,比如这个:。

我从一开始就在学习OpenCL,对平台=主机+设备的想法感到困惑。在我的工作PC中,有2个平台被检测到:平台0只有CPU,平台1只有英伟达GPU。p> 这台电脑实际上也有一个英特尔GPU,但我假设它不支持OpenCL,所以这里没有显示。我的问题是:在OpenCL应用程序中,有主机和设备。根据我在书中的理解,通常主机和设备来自一个平台。然后在我的PC中,我需要使用CPU或英伟达GPU作为OpenCL应用程序的主机和设备。这是真的吗


我试着自己搜索,一些答案确实帮助我更好地理解这个话题,比如这个:。但是关于主机和设备都使用一个硬件的问题,我的搜索并没有得到回答或证实。

我想你在这里混淆了一些术语

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

平台可以提供多个不同的设备:例如,如果安装了英伟达OpenCL驱动程序,它为每个支持的GPU提供OpenCL设备。同时,Intel驱动程序将Intel CPU作为OpenCL设备提供

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

  • 使用
    clGetPlatformIds
  • 使用
    clgetDeviceID
    查找OpenCL设备,无论您想使用哪个平台
  • 使用
    clCreateContext
    clCreateProgram
    等创建OpenCL上下文、程序、命令队列和内核
  • 将必要的数据复制到缓冲区或内核参数
  • 使用
    clEnqueueNDRangeKernel
    在一个或多个设备上执行内核
  • 从缓冲区复制数据

  • 我想你把一些术语弄混了

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

    平台可以提供多个不同的设备:例如,如果安装了英伟达OpenCL驱动程序,它为每个支持的GPU提供OpenCL设备。同时,Intel驱动程序将Intel CPU作为OpenCL设备提供

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

  • 使用
    clGetPlatformIds
  • 使用
    clgetDeviceID
    查找OpenCL设备,无论您想使用哪个平台
  • 使用
    clCreateContext
    clCreateProgram
    等创建OpenCL上下文、程序、命令队列和内核
  • 将必要的数据复制到缓冲区或内核参数
  • 使用
    clEnqueueNDRangeKernel
    在一个或多个设备上执行内核
  • 从缓冲区复制数据

  • 谢谢@apemanzilla的解释。因此,主机不是“硬件”,而是将在CPU上执行的“主程序”。然后在一个平台中,CPU也作为设备提供。在这种情况下,我可以使用CPU执行我的主机程序,也可以使用CPU作为OpenCL设备,按照您描述的工作流执行内核。我的理解正确吗?谢谢@apemanzilla的解释。因此,主机不是“硬件”,而是将在CPU上执行的“主程序”。然后在一个平台中,CPU也作为设备提供。在这种情况下,我可以使用CPU执行我的主机程序,也可以使用CPU作为OpenCL设备,按照您描述的工作流执行内核。我的理解正确吗?