我创建程序将2d数组从slave发送到master。像这样的代码:
int **hasil;
hasil=(int**)malloc(baris*sizeof(int));
for(t=0;t<baris;t++){
hasil[t]=(int*)malloc(kolom*sizeof(int));
}
//some code to generate data
MPI_Type_contiguous(kolom, MPI_INT,&rowtype);
MPI_Type_commit(&rowtype);
if(rank==master){
int **terima;
int t,m,x;
terima=(int**)malloc(baris*sizeof(int));
for(t=0;t<baris;t++){
terima[t]=(int*)malloc(kolom*sizeof(int));
for(m=0;m<kolom;m++){
terima[t][m]=-1;
}
}
for(x=1;x<numOfProc;x++){
MPI_Recv(&(terima[0][0]),baris,rowtype,x,99,MPI_COMM_WORLD,&status);
}
} else {
MPI_Send(&(hasil[0][0]),baris,rowtype,master,99,MPI_COMM_WORLD);
}
我不知道为什么不发送所有数组元素。
on'hasil':
1 123 1234 1234 55345
2 123 1234 1234 12345
3 98765 1234 1234 12345
4 123 1234 1234 12345
5 123 1234 1234 12345
6 123 1234 1234 12345
7 123 1234 1234 12345
8 123 1234 1234 12345
9 123 1234 1234 12345
10 123 1234 1234 12345
11 123 1234 1234 12345
但是'terima':
1 123 1234 1234 55345
2 123 1234 1234 12345
3 98765 1234 1234 12345
4 123 1234 1234 12345
-1 -1 -1 -1 -1
-1 -1 -1 -1 -1
-1 -1 -1 -1 -1
-1 -1 -1 -1 -1
-1 -1 -1 -1 -1
-1 -1 -1 -1 -1
-1 -1 -1 -1 -1
有人知道我的代码有什么问题吗?请告诉我。
全部谢谢
答案 0 :(得分:1)
我在malloc语句中看到了一个明显的错误:
int **hasil;
hasil=(int**)malloc(baris*sizeof(int));
当您分配行时,您基本上是在分配指针,因此该语句应如下所示:
int **hasil;
hasil=(int**)malloc(baris*sizeof(int *));
我在分配terima
时看到同样的错误。
不确定这是否可以解决您的问题,但这需要得到纠正。请试试这个并告诉我。
答案 1 :(得分:1)
除了关于数组分配的说法之外,您发送/接收错误的字节数。伯爵应该是1,而不是巴利斯:
MPI_Send(&(hasil[0][0]),1,rowtype,master,99,MPI_COMM_WORLD);
这是因为在给定的地址&amp;(hasil [0] [0])(顺便说一下,与hasil [0]相同)你已经分配了一个大小为kolom的数组:
hasil[t]=(int*)malloc(kolom*sizeof(int));
因此,你不能从hasil [0]发送超过kolom字节。要么发送kolom整数,要么发送1行类型。
另外,我真的不明白你想从每个进程发送什么以及你想要保存它的位置?您可以将所有数据保存在MPI_Recv中的一个位置 - 在terima [0]中。您可以一个接一个地将来自不同进程的1行数据发送/接收到terima中的不同位置。所以你可以在主人身上写下这个:
for(x=1;x<numOfProc;x++){
MPI_Recv(terima[x],1,rowtype,x,99,MPI_COMM_WORLD,&status);
}
另一方面,如果您希望将整个hasil数组从所有线程传输到主服务器(请记住,如果您只接收到terima中,这将覆盖数据),您需要在循环中执行此操作,因为这是你分配二维数组的方式:
for(i=1;i<baris;i++){
MPI_Send(hasil[i],1,rowtype,master,99,MPI_COMM_WORLD,&status);
}
修改发送整个值矩阵需要更改分配数据的方式。而不是带指针的二维数组,您可以分配一个可以容纳整个矩阵的连续内存:
int *terima;
terima=(int*)malloc(baris*kolom*sizeof(int));
然后,不是写terima [t] [m]而是使用线性索引来处理数组:terima [t * kolom + m]。现在,您可以使用
发送和接收整个矩阵MPI_Recv(terima,baris,rowtype,x,99,MPI_COMM_WORLD,&status);