我想在GPU集群上使用OpenMPI和CUDA时提出建议。
我是初学者,我觉得我无法预见我对软件架构的决定会产生什么后果。我非常感谢某人的建议/经验法则,因为关于GPU集群的信息非常稀少。
群集架构
目标
1)将数据从root_MPI_process重新分发到MPI_processes
2)将数据加载到GPU,执行内核(SIMT并行计算),得到结果
3)将结果发送回root_MPI_process
4)root_MPI_process处理结果,创建新数据 ...迭代 - >重新分配数据......
步骤1,2,3纯粹是 [SERIAL]
,,每个衍生的MPI_process独立于所有其他,即在任意两个MPI_processes之间没有移动任何数据< / em>的
我对软件架构的考虑
替代。 1)1 MPI过程== 1 GPU
X
MPI_processes,每个MPI_process(root_MPI_process除外)负责1个GPU 替代。 2)1个MPI进程== 1个计算集群节点(具有多个GPU)
X
MPI流程,每个MPI_process(root_MPI_process除外)在1个计算群集节点上运行1)从经验的角度来看,除了数据传递(在1中更容易,在2中更复杂),从我的观点来看还有什么? - 我应该考虑吗?
2)此应用程序无法利用CUDA感知MPI的优势,因为数据不在GPU之间传递,是吗? (CUDA是否意识到MPI对GPU之间的其他通信很有用?)
3)解决方案2)提供具有单一地址空间的通用寻址空间,但解决方案1)没有,因为每个MPI_process访问1个GPU,是吗?
修改
这是正在进行的研究,我不敢估计E2E时机。作为参考,此任务需要约。 <3> GTX 1070 <60>小时,群集有16x特斯拉K80。我此刻的计算时间非常无限。
数据大约 1 [kB]每个线程,因此1个内核需要 blocks * threads * 1024 [B]
数据,我想运行1个内核每个GPU一次。
内核(每个块中的每个线程)运行模拟二阶动态系统,评估小神经网络( 30个神经元)(乘法和加法的数量在 100次)之前,在提供结果之前,存在 1,000,000次模拟迭代。
从上面我可以肯定地说,对内核的评估比从主机&lt; - &gt;设备传输数据更耗时。
答案 0 :(得分:2)
1)从经验的角度来看,除了数据传递(在1中更容易,在2中更复杂),从我的观点来看还有什么? - 我应该考虑吗?
如果你假设kernel execution time >>> communication
时间成立,那么这是一个简单的问题。此外,如果您不利用/打算真正使用Xeon CPU,那么事情就更简单了。只需使用Alt. 1)
(1到1,纯MPI)。 Alt. 2)
意味着您必须实现两层工作负载分配。没有充分理由就没有必要这样做。
如果你的假设不成立,事情就会变得更加复杂,而且远远超出对SO的简明回答。如果没有清楚地了解应用程序的特性,解决这些问题是没有用的。
如果您的应用程序运行&gt;,您可能需要考虑一件事1天,是检查点。
2)此应用程序无法利用CUDA感知MPI的优势,因为数据不在GPU之间传递,是吗? (CUDA是否意识到MPI对GPU之间的其他通信很有用?)
由于CPU在步骤4)中处理结果数据,因此您无法从支持CUDA的MPI中受益。
3)解决方案2)提供具有单一地址空间的通用寻址空间,但解决方案1)没有,因为每个MPI_process访问1个GPU,是吗?
不,第二种方法中有多个(9)地址空间。每个计算节点一个地址空间。所以你必须使用MPI,即使在第二种方法中 - 这正是使1-rank-1-GPU映射更加简单的原因。
您应该考虑的一件事,您的步骤4)将在某个时刻成为可扩展性瓶颈。但可能不是你所谈论的尺度。值得投资于性能分析工具/方法,以便更好地了解代码的执行方式以及开发和扩展到生产过程中的瓶颈所在。
答案 1 :(得分:1)
我会从第一个选择开始:
在任何一种情况下,到每个节点的数据传输都是相同的,所以这是a,wash。
第一种方案允许调度程序为每个GPU分配一个核心,并留有余地。
如果正确完成,则生成多个MPI侦听器的时间仅发生一次。
除非在每个MPI工作者中添加并行性,否则第二种方法必须以串行方式处理每个GPU。
我唯一需要注意的是观看网络和多个核心争夺数据的DMA。如果冲突占主导地位,请添加额外的代码以实现第二种替代方案。首先编写更简单的解决方案并在第4步检查第一次迭代以查看数据传递是否有问题,几乎没有丢失。