parallel-processing - MPI集合运算在多核机上的实现细节

标签 parallel-processing fortran mpi fortran90

在 MPI 中,每个级别都有一个唯一的地址空间,它们之间的通信通过消息传递进行。

我想知道MPI 如何在具有共享内存的多核机器上工作。 如果队列位于没有共享内存的两台不同机器上,则 MPI 必须使用消息进行通信。但是如果列在同一台物理机器上(但每个列仍然有不同的地址空间),MPI 调用会利用共享内存吗?

例如,假设我发出一个 ALLREDUCE 调用。我有两台机器 M1 和 M2,每台机器都有 2 个内核。等级 R1 和 R2 在机器 M1 的核心 1 和核心 2 上,R3 和 R4 在机器 M2 的核心 1 和 2 上。 ALLREDUCE 将如何发生?是否会传输超过 1 条消息? 理想情况下,我希望 R1 和 R2 使用它们可用的共享内存(类似于 R3 和 R4)进行 reduce,然后在 M1 和 M2 之间交换消息。

是否有任何文档可以让我阅读有关 MPI 中集体操作的实现细节?

最佳答案

集体操作的实现因一个 MPI 库而异。最好查看您正在使用/想要使用的具体库的源代码。

我可以告诉您 Open MPI 如何实现集合体。 Open MPI 由不同组件(模块)所在的不同层组成。有用于集合操作的 coll 框架,它使用较低级别的 btl 框架来传输消息。 coll 框架中实现了许多不同的算法以及实现这些算法的许多不同模块。评分机制用于选择库认为最适合您的案例的模块,但这可以很容易地用 MCA 参数覆盖。最突出的是 tuned 模块,该模块经过良好测试,可在从共享内存到 InfiniBand 的各种互连上很好地扩展。 tuned 模块完全不关心进程所在的位置。它只是使用 btl 框架发送消息,btl 负责使用共享内存或网络操作。 tuned 模块中的一些算法是分层的,并且通过适当调整参数(OMPI 的巨大灵 active 来自于许多内部 MCA 参数可以在不重新编译的情况下更改的事实)这些算法可以匹配集群的实际层次结构。还有另一个名为 hierarchcoll 模块,它会尽力收集尽可能多的物理拓扑信息并使用它来优化集体通信。

不幸的是,几乎所有 MPI 实现都是用 C 语言编写的,顶层有非常薄的层以提供 Fortran 接口(interface)。因此,如果您想深入探讨这个主题,我希望您对 C 语言的了解高于平均水平。关于集体行动优化的研究论文也很多。其中一些是免费提供的,其他的则通过学术订阅提供。

关于parallel-processing - MPI集合运算在多核机上的实现细节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11665548/

相关文章:

python - 来自 Linux 上的命令队列的并行处理(bash、python、ruby ......随便)

c++ - 链接器错误最可爱的二进制文件与 matlab

c - 使用 MPI_Reduce 的等级 ID 错误

linux - 增加虚拟内存而不增加VmSize

c++ - 变长时多线程的输出如何合并?

haskell - 用于功能并行的编程语言 : F# vs Haskell

java - 在长时间运行的应用程序中运行并行任务

fortran - 如何在Fortran 90中使用include语句?

oop - 编写健壮的 "modern"Fortran 代码

c - MPI_SEND 和 MPI_RECIEVE 没有编译引用