并非所有数组元素都发送

时间:2012-09-03 17:31:52

标签: c parallel-processing mpi

我创建程序将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

有人知道我的代码有什么问题吗?请告诉我。

全部谢谢

2 个答案:

答案 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);