我试图解决的问题是:
我有一个计算大型2D矩阵的C++串行代码。为了优化这个过程,我希望使用MPI将这个大的2D矩阵分割成4个节点(例如)来运行。在每个时间步结束时,仅发生节点之间的边缘值共享。每个节点都与其相邻节点共享边缘数组数据A [i] [j]。
根据对MPI的了解,我要实现以下方案。
我有一个计算大型2D矩阵的C++串行代码。为了优化这个过程,我希望使用MPI将这个大的2D矩阵分割成4个节点(例如)来运行。在每个时间步结束时,仅发生节点之间的边缘值共享。每个节点都与其相邻节点共享边缘数组数据A [i] [j]。
根据对MPI的了解,我要实现以下方案。
if (myrank == 0)
{
for (i= 0 to x)
for (y= 0 to y)
{
C++ CODE IMPLEMENTATION
....
MPI_SEND(A[x][0], A[x][1], A[x][2], Destination= 1.....)
MPI_RECEIVE(B[0][0], B[0][1]......Sender = 1.....)
MPI_BARRIER
}
if (myrank == 1)
{
for (i = x+1 to xx)
for (y = 0 to y)
{
C++ CODE IMPLEMENTATION
....
MPI_SEND(B[x][0], B[x][1], B[x][2], Destination= 0.....)
MPI_RECEIVE(A[0][0], A[0][1]......Sender = 1.....)
MPI BARRIER
}
我想知道我的做法是否正确,也希望得到关于其他MPI函数实现的指导。
谢谢, Ashwin。
double d[50][50];
,那就是一块连续的内存。处理动态分配的“伪二维”数组的一种方法是分配一块指针和一个单独的(通常是不连续的)内存块集,每行一个。请参见使用malloc
时,C如何为2D(3D...)数组分配空间?中的讨论。 - Jonathan Leffler