0

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

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

我的问题是,这如何在多张卡上工作?以它们运行的​​速度,硬件是否会在执行时间上产生细微的差异,以至于在一张卡上的一个 GPU 上的计算可能比在另一张卡上的另一个 GPU 上的相同计算结束得更快或更慢?

谢谢

4

2 回答 2

3

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

这不是真的。例如,由于内存访问延迟的差异,GPU 上的不同线程可能在不同时间完成。这就是为什么 OpenCL 中有同步原语(例如barrier命令)的原因。您永远不能假设您的线程精确地并行运行。

多个 GPU 也是如此。无法保证它们是同步的,因此您需要依赖 clFinish 等 API 调用来显式同步它们的工作。

于 2012-04-26T18:27:25.680 回答
2

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

在单个 GPU 上,只有在同一计算单元(或 NVIDIA 术语中的 SM)上执行并且属于同一扭曲/波前的线程才能保证同步执行。您永远不能真正指望这一点,但对于某些设备,编译器可以确定会出现这种情况(我特别考虑一些 AMD 设备,只要 worgroup 大小硬编码为 64)。

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

于 2012-04-26T20:32:12.373 回答