我正在研究Tesla C1060,它包含240个具有计算能力1.3的处理器内核。知道每个8个内核都由一个多处理器控制,并且每个线程块都分配给一个多处理器,那么我希望启动一个包含30个块的网格,应该花费相同的执行时间。块。然而,事情并没有很好地扩展,即使每个块有8个线程,我也从未得到过这么好的扩展。当每个块有512个线程时,我会得到一个块的大致相同的时间,当网格包含最多5个块时。当我将性能与在8核CPU机器上实现与MPI并行化的相同任务进行比较时,这是令人失望的。 有人可以向我解释一下吗?
顺便说一句,计算机实际上包含两张这张特斯拉卡,它是否会自动在它们之间分配块,还是我必须采取进一步措施来确保两者都被充分利用?
编辑: 关于我的上一个问题,如果我在同一台计算机上启动两个独立的MPI进程,我如何在不同的图形卡上进行每个工作?
EDIT2:根据Pedro的要求,这是一个描绘垂直访问的总时间(标准化为1)与并行块数的关系图。线程数/块数= 512.数字很粗糙,因为我观察到大量块的时间差异非常大。
答案 0 :(得分:1)
速度与块数不是简单的线性关系。这取决于一堆东西。例如,内存使用情况,块中执行的指令数等等
如果您想进行多GPU计算,则需要修改代码,否则只能使用一张GPU卡。
答案 1 :(得分:-1)
在我看来,你只是简单地选择了一个C程序并在CUDA中编译它而没有太多考虑。
亲爱的朋友,这不是要走的路。您必须设计代码以利用CUDA卡具有与常规CPU不同的内部架构这一事实。特别是,请考虑以下因素:
内存访问模式 - GPU中有许多内存系统,每个系统都需要考虑如何最好地使用它
线程分歧问题 - 如果大多数时候大多数线程遵循相同的代码路径,性能将会很好
如果您的系统有2个GPU,则可以同时使用它们来加速某些(合适的)问题。问题在于两者的存储区域是分开的,并且彼此之间不容易“可见” - 您必须设计算法以将其考虑在内。
除非最初使用MPI编写,否则在GPU之前编写的典型C程序通常不易移植。
要使每个CPU MPI线程使用不同的GPU卡,您可以使用cudaSetDevice()