在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之间不移动任何数据段。
我对软件架构的考虑
Alt。1) 1 MPI处理== 1 GPU
X
MPI_processes,每个MPI_process (root_MPI_process除外)负责一个GPU。Alt。2) 1 MPI处理== 1计算集群节点(具有多个GPU)
X
MPI进程,每个MPI_process (root_MPI_process除外)运行在一个计算集群节点上。问题
( 1)从有经验的角度来看,除了数据传递(在1中比较容易,在2中更复杂),从我的角度来看,我还应该考虑什么?
2)这个应用程序不能利用CUDA感知的MPI,因为数据不是在GPU之间传递的,对吗?( CUDA是否知道MPI对其他东西有用?)
3)解决方案2)提供具有单地址空间的通用寻址空间,但解决方案1)不提供,因为每个MPI_process访问1 GPU,对吗?
编辑
blocks * threads * 1024 [B]
1 kB,因此1内核需要数据的kB,我想一次运行每个GPU一个内核。从上面我可以自信地说,对内核的评估比主机<->设备的数据传输更耗时。
发布于 2017-11-07 20:00:05
( 1)从有经验的角度来看,除了数据传递(在1中比较容易,在2中更复杂),从我的角度来看,我还应该考虑什么?
如果您对kernel execution time >>> communication
时间的假设成立,那么这是一个简单的问题。另外,如果您不打算真正利用Xeon,那么事情就更简单了。只需使用Alt. 1)
(1 : 1,纯MPI)。Alt. 2)
意味着您必须实现两层工作负载分布。没有充分的理由就没有必要这样做。
如果你的假设不成立,事情就会变得更加复杂,而不仅仅是一个简洁的答案。如果不清楚地了解应用程序的特性,那么解决这些问题是没有用的。
如果您的应用程序运行时间超过1天,您可能必须考虑的一件事是检查点。
2)这个应用程序不能利用CUDA感知的MPI,因为数据不是在GPU之间传递的,对吗?( CUDA是否知道MPI对其他东西有用?)
因为CPU在步骤4中处理结果数据,所以您不会从CUDA感知的MPI中获益。
3)解决方案2)提供具有单地址空间的通用寻址空间,但解决方案1)不提供,因为每个MPI_process访问1 GPU,对吗?
不,在第二种方法中有多个(9)地址空间。每个计算节点有一个地址空间。所以无论如何,你必须使用MPI,即使是在第二种方法中--这正是使1级-1-GPU映射变得更简单的原因。
您应该考虑的一件事是,在某个时候,您的步骤4)将成为可伸缩性的瓶颈。但可能不是你所说的天平。值得对性能分析工具/方法进行投资,以便很好地了解您的代码是如何执行的,以及开发和扩展到生产过程中的瓶颈所在。
发布于 2017-11-08 04:11:58
首先,我要谈谈第一种选择:
在这两种情况下,到每个节点的数据传输都是相同的,所以这是一个wash。
第一个场景允许调度程序为每个GPU分配一个内核,并留有空间。
如果操作正确,则生成多个MPI侦听器的时间只发生一次。
第二种选择是,除非在每个MPI工作器中添加并行性,否则必须以串行方式处理每个GPU。
我唯一的警告是观察网络和DMA,为多个核心争夺数据。如果冲突占主导地位,则添加额外的代码来实现第二种选择。在首先编写更简单的解决方案并在步骤4检查第一次迭代以确定数据传递是否有问题时,几乎没有什么损失。
https://stackoverflow.com/questions/47158985
复制相似问题