【发布时间】:2019-12-25 03:41:10
【问题描述】:
我有一个 3D 数组 Foo3D (50 x 100 x 100) 在等级 0 和 1 中。Foo3D 是这样分配的:
int nx = 50;
int ny = 100;
int nz = 100;
typedef int nRarray[100][50];
nRarray *Foo3D;
if ((Foo3D = (nRarray *)malloc((nx*ny*nz)*sizeof(int))) == 0) {fprintf(stderr,"malloc1 Fail \n"); return 1;}
我将一些数字分配给排名为 0 的 Foo3D,并将其保存到一个新的二维数组 (Foo2D) 中:
if (myrank == 0) {
for (int j = 0; j < ny; j++) {
for (int k = 0; k < nz; k++) {
Foo3D[0][j][k] = j + k;
Foo2D[j][k] = Foo3D[0][j][k];
}
}
}
现在,我有兴趣将 Foo2D 发送到排名 1,并将其放在 Foo3D 中的位置。事实上,我知道我可以将Foo2D 发送到排名 1 为:
if (myrank == 0)
{
MPI_Send(Foo2D,sizeof_Foo2D,MPI_INT,1,100,MPI_COMM_WORLD);
}
else if (myrank == 1)
{
MPI_Recv(Foo2D,sizeof_Foo2D,MPI_INT,0,100,MPI_COMM_WORLD, &status);
}
然后将接收到的 rank 1 中的Foo2D 分配给它在Foo3D 中的位置为:
if (myrank == 1)
{
for (int j = 0; j < ny; j++) {
for (int k = 0; k < nz; k++) {
Foo3D[0][j][k] = Foo2D[j][k];
}
}
}
不使用此过程并将Foo2D 作为中间变量,是否可以将等级0 中的Foo3D 切片直接 发送到等级1 中的等效位置?事实上,我不想将整个 Foo3D 发送到排名 1,因为它是一个非常大的数组,我有兴趣只发送一部分到排名 1。
【问题讨论】:
-
你的数组必须分配在连续的内存中,但你的 sn-p 没有显示它们是如何声明的。如果您需要更多帮助,请上传minimal reproducible example。
-
@GillesGouaillardet 完成。
-
有些东西仍然丢失,这还不是minimal reproducible example。您的
else if(...)测试中也可能有错字。