我发现了这个 OpenCL: Running CPU/GPU multiple devices
但我仍然有疑问(3)如何在多个设备上运行程序。配方如下?(Q1)
创建您要使用的设备。
为每个设备创建一个上下文。
为每个上下文调用clBuilProgram来构建程序
为每个程序调用clCreateCommandQueue为每个上下文构建一个命令队列
为每个上下文和每个函数参数调用clCreateBuffer。
或者我必须连接CommandQueues。(Q2)
是否有某些示例代码或指向教程的链接? (Q3)
答案 0 :(得分:5)
您创建包含所有设备的单个上下文。上下文构造需要一系列设备。您为上下文编译一次程序。您可以为程序调用clBuildProgram或clCompileProgram和clLinkProgram一次,列出所有设备或不列出任何设备,并让它在上下文中为所有设备构建。为上下文中的每个设备创建命令队列。为要访问的每个阵列创建一个缓冲区。如果要在不同的设备上处理数组的不同部分,可以创建两个缓冲区,或者使用子缓冲区将其划分为多个部分。
如果您对针对所有设备的同一程序感到不满意并希望进一步优化,您可以为每个设备创建一个单独的程序,或者创建一次程序并为每个传入宏的设备单独调用clCompileProgram。
答案 1 :(得分:0)
如果您所针对的所有设备都来自同一平台,那么@ Lee的响应就可以了(例如AMD GPU + CPU,或Intel GPU + CPU)。如果您希望不得不针对混合平台(例如将Nvidia GPU与AMD GPU和CPU结合使用),那么您的上下文无法从一个平台跨越到另一个平台 - 至少,每个平台需要一个上下文。
我看到的选项是:
选项3在工作分配中有点棘手,因为你有两个工作分工的级别 - 上下文/平台之间和设备之间。选项1是IMHO,它是访问计算机中每个OpenCL设备的最简单方法,无论其平台如何。如果您保证始终使用来自一个供应商的设备(即一个平台中的所有设备),则选项2才真正值得。如果同时针对GPU + CPU,这种假设会很快失败。
完成上述三个选项后,您将需要至少一个命令队列每个设备。您需要为每组相同的设备编译OpenCL内核。每个供应商的每一代GPU都不同。至少,您最终可能会遇到从一个设备到另一个设备具有不同定义的宏。在最坏的情况下,您可以从一个设备到另一个设备使用不同的算法(如果使用上面的选项1,则更容易处理)。