OpenCL和多个视频卡

时间:2012-04-26 15:07:13

标签: opencl gpu

我对CPU和GPU之间差异的理解是,GPU不是通用处理器,如果一个视频卡包含10个GPU,每个GPU实际共享相同的程序指针并优化GPU上的并行性,我需要确保每个GPU实际上都运行相同的代码。

在同一张卡上同步不是问题,因为每个GPU都是物理并行运行的,因此它们应该同时完成。

我的问题是,这对多张牌有何影响?在它们运行的​​速度下,硬件是否在执行时间上略有不同,使得一张卡上的一个GPU上的计算可能比另一张卡上的另一个GPU上的相同计算更快或更慢?

感谢

2 个答案:

答案 0 :(得分:3)

  

在同一张卡上同步不是问题,因为每个GPU都是物理并行运行的,因此它们应该同时完成。

事实并非如此。例如,由于存储器访问等待时间的不同,GPU上的不同线程可能在不同时间完成。这就是为什么OpenCL中存在同步原语,例如barrier命令。你永远不能假设你的线程正好并行运行。

多个GPU也是如此。无法保证它们处于同步状态,因此您需要依赖clFinish等API调用来明确同步其工作。

答案 1 :(得分:2)

我认为你可能会对线程如何在GPU上工作感到困惑。首先解决多个GPU的问题。多个GPU永远不会共享程序指针,因此它们几乎不会同时完成内核。

在单个GPU上,只有在同一计算单元上执行的线程(或NVIDIA用语中的SM)和同一个warp / wavefront的一部分才能保证同步执行。 你永远不能指望这一点,但对于某些设备,编译器可以确定是这种情况(我特意考虑一些AMD设备,只要worgroup大小硬编码为64)。

无论如何,正如@vocaro指出的那样,这就是你需要为本地内存使用屏障的原因。 要强调的是,即使在同一GPU上,线程也不会在整个设备上并行执行 - 仅在每个计算单元内执行。