0

我目前正在使用一个用 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 个进程的原始问题。任何的意见都将会有帮助。谢谢!!

4

0 回答 0