我不认为(受过教育的想法,不是确定的)你将能够完全从你的 MPI 程序中做你想做的事情。
系统对调用的响应MPI_Get_processor_name
取决于系统;在您的系统上,它可能会根据需要返回node00
, node01
, node02
,node03
或者它可能会my_big_computer
针对您实际运行的任何处理器返回。前者的可能性更大,但不能保证。
一种策略是启动 32 个进程,如果您可以确定每个进程在哪个节点上运行,则将您的通信器分成 4 个组,每个节点上一个。通过这种方式,您可以根据需要自行管理内部和内部通信。
另一种策略是启动 4 个进程并将它们固定到不同的节点。如何将进程固定到节点(或处理器)将取决于您的 MPI 运行时和您可能拥有的任何作业管理系统,例如 Grid Engine。这可能会涉及设置环境变量——但您没有告诉我们有关您的运行时系统的任何信息,因此我们无法猜测它们可能是什么。然后,您可以让 4 个进程中的每一个动态生成另外 7 个(或 8 个)进程,并将它们固定到与初始进程相同的节点。为此,请阅读交互器主题和运行时系统的文档。
第三种策略(现在有点疯狂)是启动 4 个单独的 MPI 程序(每个程序 8 个进程),在集群的每个节点上启动一个,并在它们执行时加入它们。阅读MPI_Comm_connect
并MPI_Open_port
了解详情。
最后,为了更有趣,您可以考虑混合您的程序,在每个节点上运行一个 MPI 进程,并让每个进程执行一个 OpenMP 共享内存(子)程序。