【发布时间】:2015-11-05 18:50:33
【问题描述】:
我在发送和接收二维数组的列时遇到问题。
我有 2 个进程。第一个进程有一个二维数组,我想将它的一部分发送到第二个进程。所以说每个等级都有一个 9x9 数组,我希望等级 0 发送到等级 1 只是某些列:
例子:
-1--2--3-
-2--3--4-
-5--6--7-
...
我想发送“1,2,5,...”和“3,4,7,...”。
我已经编写了只发送第一列的代码,并且我已经阅读了this answer,并且我相信我已经为该列正确定义了一个 MPI_Type_vector:
MPI_Type_vector(dime,1,dime-1,MPI_INT,&LEFT_SIDE);
这里的dime,9,是数组的大小;我正在发送 9 个 1 MPI_INT 块,每个块以 8 的步幅分隔 - 但即使只是发送这一列也会给我无效的结果。
我的代码如下:
#include <mpi.h>
#include <stdio.h>
#include <stdlib.h>
#define dime 9
int main (int argc, char *argv[])
{
int size,rank;
const int ltag=2;
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD, &size); // Get the number of processes
MPI_Comm_rank(MPI_COMM_WORLD, &rank); // Get the rank of the process
int table[dime][dime];
for (int i=0; i<dime; i++)
for (int j=0; j<dime; j++)
table[i][j] = rank;
int message[dime];
MPI_Datatype LEFT_SIDE;
MPI_Type_vector(dime,1,dime-1,MPI_INT,&LEFT_SIDE);
MPI_Type_commit(&LEFT_SIDE);
if(rank==0) {
MPI_Send(table, 1, LEFT_SIDE, 1, ltag, MPI_COMM_WORLD);
} else if(rank==1){
MPI_Status status;
MPI_Recv(message, 1, LEFT_SIDE, 0, ltag, MPI_COMM_WORLD, &status);
}
if(rank == 1 ){
printf("Rank 1's received data: ");
for(int i=0;i<dime;i++)
printf("%6d ",*(message+i));
printf("\n");
}
MPI_Finalize();
return 0;
}
但是当我运行它并查看我收到的数据时,我得到的不是全零就是乱码:
$ mpicc -o datatype datatype.c -Wall -g -O3 -std=c99
$ mpirun -np 2 datatype
Rank 1's received data: 0 32710 64550200 0 1828366128 32765 11780096 0 0
数字每次都变化的地方。我做错了什么?
【问题讨论】:
-
This answer 详细讨论了从二维矩阵中选择列。
-
是的,我看到了..但我无法解决问题..我的代码将我不想保留的数字更改为零。
-
原始后笛卡尔拓扑中有很多不相关的东西,非阻塞发送/接收,随机数生成。我试图将这个问题剥离到它的本质,以便答案是有意义的。请注意,将问题精简到其基本要素对于找到解决方案至关重要。