4

我正在研究 Tesla C1060,它包含 240 个处理器内核,计算能力为 1.3。知道每 8 个内核由单个多处理器控制,并且每个线程块都分配给单个多处理器,那么我预计启动 30 个块的网格应该与单个线程花费相同的执行时间堵塞。然而,事情并没有很好地扩展,即使每个块有 8 个线程,我也从来没有得到过这种很好的扩展。走到另一个极端,每个块有 512 个线程,当网格最多包含 5 个块时,我得到一个块的大致相同时间。当我将性能与在 8 核 CPU 机器上实现与 MPI 并行的相同任务进行比较时,这令人失望。有人可以向我解释一下吗?

顺便说一句,计算机实际上包含两张特斯拉卡,那么它是自动在它们之间分配块,还是我必须采取进一步措施确保两者都被充分利用?

编辑:关于我的最后一个问题,如果我在同一台计算机上启动两个独立的 MPI 进程,我怎样才能让每个进程在不同的显卡上工作?

EDIT2:根据 Pedro 的要求,这里是一个图表,描绘了垂直访问的总时间,标准化为 1 ,与并行块的数量。线程/块的数量 = 512。这些数字是粗略的,因为我观察到大量块的时间差异很大。

4

2 回答 2

1

速度与块数不是简单的线性关系。这取决于一堆东西。例如,内存使用量、块中执行的指令数等。

如果要进行多GPU计算,则需要修改代码,否则只能使用一张GPU卡。

于 2012-08-29T15:02:23.793 回答
-1

在我看来,您只是简单地采用了一个 C 程序并在 CUDA 中编译它而没有太多的麻烦。

亲爱的朋友,这不是要走的路。您必须设计代码以利用 CUDA 卡具有与常规 CPU 不同的内部架构这一事实。特别要考虑以下几点:

  • 内存访问模式- GPU 中有许多内存系统,每个系统都需要考虑如何最好地使用它

  • 线程分歧问题——只有当你的大多数线程大部分时间都遵循相同的代码路径时,性能才会好

如果您的系统有 2 个 GPU,您可以同时使用它们来加速一些(合适的)问题。问题是两者的内存区域是分开的并且不容易被彼此“看到” - 你必须设计你的算法来考虑到这一点。

在 GPU 时代之前编写的典型 C 程序通常不容易移植,除非最初是考虑到 MPI 编写的。

要使每个 CPU MPI 线程与不同的 GPU 卡一起工作,您可以使用 cudaSetDevice()

于 2014-01-12T01:01:41.463 回答