首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >GPU集群上MPI + CUDA软件体系结构

GPU集群上MPI + CUDA软件体系结构
EN

Stack Overflow用户
提问于 2017-11-07 13:17:59
回答 2查看 578关注 0票数 0

在GPU集群上使用OpenMPI和CUDA时,我想征求一些建议。

我是一个初学者,我觉得我无法预见我对软件架构所做决定的后果。我非常感谢某人的建议/经验法则,因为关于GPU集群的信息非常稀少。

框架:

集群体系结构

  • 集群有1个前端节点和9个计算节点。
  • 集群是异构的,每个节点都有Intel Xeon CPU和Nvidia Tesla K80,但是处理器数和GPU卡数不同。
  • 集群运行PBSPro调度程序。

目标

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。
  • 然后,MPI_process接收一块数据,适当地传递给GPU并执行内核.上述步骤

Alt。2) 1 MPI处理== 1计算集群节点(具有多个GPU)

  • 启动X MPI进程,每个MPI_process (root_MPI_process除外)运行在一个计算集群节点上。
  • 然后,MPI_process标识GPU的数量,并要求从root_MPI_process获得适当数量的数据。
  • 数据从root_MPI_process传递到MPI_process,然后在可用的GPU之间重新分配.上述步骤2、3、4

问题

( 1)从有经验的角度来看,除了数据传递(在1中比较容易,在2中更复杂),从我的角度来看,我还应该考虑什么?

2)这个应用程序不能利用CUDA感知的MPI,因为数据不是在GPU之间传递的,对吗?( CUDA是否知道MPI对其他东西有用?)

3)解决方案2)提供具有单地址空间的通用寻址空间,但解决方案1)不提供,因为每个MPI_process访问1 GPU,对吗?

编辑

  • 这是正在进行的研究,我不敢估计E2E的时间。作为参考,此任务需要大约。60时,在3xGTX 1070上,集群内有16倍特斯拉K80。我目前的计算时间是无限的。
  • 每个线程的数据大约是blocks * threads * 1024 [B] 1 kB,因此1内核需要数据的kB,我想一次运行每个GPU一个内核。
  • 核(每个块中的每个线程)以小神经网络(30神经元)评价的方式对二阶动态系统进行仿真(100 s/迭代中的乘法和加法次数),在给出结果之前,大约有1,000,000个仿真迭代

从上面我可以自信地说,对内核的评估比主机<->设备的数据传输更耗时。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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)将成为可伸缩性的瓶颈。但可能不是你所说的天平。值得对性能分析工具/方法进行投资,以便很好地了解您的代码是如何执行的,以及开发和扩展到生产过程中的瓶颈所在。

票数 2
EN

Stack Overflow用户

发布于 2017-11-08 04:11:58

首先,我要谈谈第一种选择:

在这两种情况下,到每个节点的数据传输都是相同的,所以这是一个wash。

第一个场景允许调度程序为每个GPU分配一个内核,并留有空间。

如果操作正确,则生成多个MPI侦听器的时间只发生一次。

第二种选择是,除非在每个MPI工作器中添加并行性,否则必须以串行方式处理每个GPU。

我唯一的警告是观察网络和DMA,为多个核心争夺数据。如果冲突占主导地位,则添加额外的代码来实现第二种选择。在首先编写更简单的解决方案并在步骤4检查第一次迭代以确定数据传递是否有问题时,几乎没有什么损失。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47158985

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档