我目前正在使用一个用 C 语言编写的带有 MPI 并行化的程序。计算网格使用常见的域分解技术进行划分。关于 2D 分解(简化)的流程布局如下:
/////////////////////////////
/ / / /
/ 1 / 2 / 3 /
/ / / /
/////////////////////////////
/ / / /
/ 4 / 5 / 6 /
/ / / /
/////////////////////////////
/ / / /
/ 7 / 8 / 9 /
/ / / /
/////////////////////////////
在代码中的某一时刻,我必须求解一系列仅具有 X 相关性的方程。使用当前形式的拓扑,由于 x 依赖性,它一次只能与 3 个进程并行化,这导致了我的问题......是否有一种方便/有效的方式将当前拓扑映射到另一个在代码中,哪个有利于完全并行化,即使用所有 9 个进程?例如,像这样:
/////////////////////////////
/ 1 /
/////////////////////////////
/ 2 /
/////////////////////////////
/ 3 /
/////////////////////////////
/ 4 /
/////////////////////////////
/ 5 /
/////////////////////////////
/ 6 /
/////////////////////////////
/ 7 /
/////////////////////////////
/ 8 /
/////////////////////////////
/ 9 /
/////////////////////////////
有人可能会问,为什么不从这个开始……好吧,2D 域分解对于整个问题来说效率更高,而且我之后还有 y 依赖关系,我需要对拓扑做类似的事情,因此上图是转置。
因此,我需要使用一些通信例程将 2D 拓扑映射到代码中的 1D 拓扑(动态),以实现与 9 个进程的完全并行化,但我不确定是否有一种高效且有效的方法来做到这一点VS 并行运行 3 个进程的原始问题。任何的意见都将会有帮助。谢谢!!