OpenCL:一个程序运行一个多个设备

时间:2015-05-13 14:51:31

标签: opencl

我发现了这个 OpenCL: Running CPU/GPU multiple devices

但我仍然有疑问(3)如何在多个设备上运行程序。配方如下?(Q1)

  1. 创建您要使用的设备。

  2. 为每个设备创建一个上下文。

  3. 为每个上下文调用clBuilProgram来构建程序

  4. 为每个程序调用clCreateCommandQueue为每个上下文构建一个命令队列

  5. 为每个上下文和每个函数参数调用clCreateBuffer。

  6. 或者我必须连接CommandQueues。(Q2)

    是否有某些示例代码或指向教程的链接? (Q3)

2 个答案:

答案 0 :(得分:5)

您创建包含所有设备的单个上下文。上下文构造需要一系列设备。您为上下文编译一次程序。您可以为程序调用clBuildProgram或clCompileProgram和clLinkProgram一次,列出所有设备或不列出任何设备,并让它在上下文中为所有设备构建。为上下文中的每个设备创建命令队列。为要访问的每个阵列创建一个缓冲区。如果要在不同的设备上处理数组的不同部分,可以创建两个缓冲区,或者使用子缓冲区将其划分为多个部分。

如果您对针对所有设备的同一程序感到不满意并希望进一步优化,您可以为每个设备创建一个单独的程序,或者创建一次程序并为每个传入宏的设备单独调用clCompileProgram。

答案 1 :(得分:0)

如果您所针对的所有设备都来自同一平台,那么@ Lee的响应就可以了(例如AMD GPU + CPU,或Intel GPU + CPU)。如果您希望不得不针对混合平台(例如将Nvidia GPU与AMD GPU和CPU结合使用),那么您的上下文无法从一个平台跨越到另一个平台 - 至少,每个平台需要一个上下文。

我看到的选项是:

  1. 每个上下文一个设备。设备之间的同步需要复制到主机内存。
  2. 一个上下文中的多个设备,仅使用一个平台。这可以使在同一上下文中的设备之间共享数据变得更加容易。
  3. 在一个上下文中来自同一平台的多个设备,每个平台一个上下文。允许您同时使用多个平台,同时为您提供在一个环境中拥有多个设备的好处。
  4. 选项3在工作分配中有点棘手,因为你有两个工作分工的级别 - 上下文/平台之间和设备之间。选项1是IMHO,它是访问计算机中每个OpenCL设备的最简单方法,无论其平台如何。如果您保证始终使用来自一个供应商的设备(即一个平台中的所有设备),则选项2才真正值得。如果同时针对GPU + CPU,这种假设会很快失败。

    完成上述三个选项后,您将需要至少一个命令队列每个设备。您需要为每组相同的设备编译OpenCL内核。每个供应商的每一代GPU都不同。至少,您最终可能会遇到从一个设备到另一个设备具有不同定义的宏。在最坏的情况下,您可以从一个设备到另一个设备使用不同的算法(如果使用上面的选项1,则更容易处理)。