【发布时间】:2012-08-29 14:43:17
【问题描述】:
我正在研究 Tesla C1060,它包含 240 个处理器内核,计算能力为 1.3。知道每 8 个内核由单个多处理器控制,并且每个线程块都分配给单个多处理器,那么我预计启动 30 个块的网格应该与单个线程花费相同的执行时间堵塞。然而,事情并没有很好地扩展,即使每个块有 8 个线程,我也从来没有得到过这种很好的扩展。走到另一个极端,每个块有 512 个线程,当网格最多包含 5 个块时,我得到一个块的大致相同时间。当我将性能与在 8 核 CPU 机器上实现与 MPI 并行的相同任务进行比较时,这令人失望。 谁能给我解释一下?
顺便说一句,计算机实际上包含两张特斯拉卡,所以它是自动在它们之间分配块,还是我必须采取进一步措施确保两者都被充分利用?
编辑: 关于我的最后一个问题,如果我在同一台计算机上启动两个独立的 MPI 进程,我怎样才能让每个进程在不同的显卡上工作?
EDIT2:根据 Pedro 的要求,这里是一个图表,描绘了垂直访问的总时间(标准化为 1 )与并行块的数量。线程/块的数量 = 512。这些数字是粗略的,因为我观察到大量块的时间差异很大。
【问题讨论】:
-
观察到的缩放距离预期缩放有多远?您可以在块数上添加缩放或效率图吗?
-
三十块仍然太少,无法完全占用您的卡。您需要 per MP 3-8 个块来分摊所有调度延迟和架构开销。您应该查看 90 到 240 之间的块数,以在 C1060 上达到峰值吞吐量。
-
@talonmies 执行 240 个块的时间大约是执行 30 个块的时间的 9 倍。这意味着在 30 个块甚至更少时已经达到了最大吞吐量。
-
要么运行非常小的块,要么计时不正确。 gt200 是一种架构,我做了很多工作,从我学到的移植 linpack 基准和编写大量线性代数代码中,你的结果毫无意义。无论如何
-
我计时正确,块的大小上面已经说了。我现在发现,使我的代码不能很好地扩展的是全局内存访问。没有它,确实 30 个块的时间几乎和一个块一样。这可能是您错过的学习内容。