具有空闲 MPI 列/内核的程序是否可以将空闲的底层内核用作非空闲列的 OpenMP 线程?

Can one program with idle MPI ranks/cores utilize the idle underlying cores as OpenMP threads for the non-idle ranks?

提问人:NoseKnowsAll 提问时间:11/17/2023 更新时间:11/17/2023 访问量:32

问:

我遇到了纯 MPI 和混合 MPI+OpenMP 之间的边缘情况,我不确定如何让 MPI+OpenMP 做我想做的事,但也担心我遇到了 XY 问题。

假设我在一台具有 64 个内核的机器上运行一个由 A 和 B 两部分组成的程序。这些部分永远不会并行执行。在执行 A 部分期间,我可以使用所有 64 个内核作为 MPI 等级。在执行 B 部分期间,我只能使用 8 个 MPI 列。如果我将每个核心映射到一个等级,那么 A 部分会充分利用我的机器,但 B 部分会给我留下空闲的核心。我想使用这些空闲内核来加速在 8 个 MPI 列上运行的 B 部分的执行。64-8=56

我知道如何做到这一点的唯一方法是,如果 B 部分是它自己的程序。然后 B 部分本身可能是一个混合 MPI+OpenMP 程序,其中有 8 个 MPI 列,每个列映射到一组 8 个内核,其中 OpenMP 可用于通过将每个内核作为 OpenMP 线程运行来加速执行。是否可以将 B 部分复制为它自己的程序,但实际上它只是一个程序的 B 部分,该程序也运行前面描述的 A 部分?

如果重要的话,我正在用 C++ 编写所有内容。

MPI OpenMP 高性能计算

评论

0赞 Gilles 11/17/2023
我想这种混合解决方案很容易编程。困难在于如何使其有效运行。为此,您需要 1/ 停用 MPI 轮询(环境变量取决于您的 MPI) 2/ 将 MPI 进程绑定到 8 个内核的集合,其中 1 个 MPI 进程将生成每组 OpenMP 线程。这应该可以解决问题。注意,非轮询方面可能会降低纯 MPI 部分的性能......
0赞 PierU 11/17/2023
也许我遗漏了一些东西,但我看不出问题出在哪里:1)在 A 中,您根本不使用 OpenMP 指令;2) 只有前 8 个 MPI 进程执行 B;3) 在 B 中,您使用 OpemMP 指令。 必须在 B 的开头调用。omp_set_num_threads(8)
0赞 Gilles Gouaillardet 11/17/2023
如果 MPI 库或资源管理器将 64 个 MPI 任务中的每个任务绑定到其自己的核心,则可能会出现此问题:B 部分最终将使其 OpenMP 线程分时。解决方案在第一条评论中给出。
0赞 NoseKnowsAll 11/18/2023
我不明白这将如何工作@Gilles,如果您要停用 MPI 轮询并将一个 MPI 进程绑定到 8 个内核,这是否明确意味着您不会在机器的所有 64 个内核上运行 A 部分?
0赞 Gilles Gouaillardet 11/18/2023
您只需将 8 个 MPI 任务绑定到每组 8 个内核即可使其工作。例如,如果您有 8 个套接字,每个套接字有 8 个内核,请将每个 MPI 任务绑定到一个套接字。这 64 个 MPI 任务将使用 64 个可用内核,但每个插槽(8 个内核)将由 8 个 MPI 任务共享。严格来说并不理想,但操作系统调度程序应该可以很好地处理它。

答: 暂无答案