1

我创建程序以将二维数组从从属发送到主控。像这样的代码:

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);
}

我不知道为什么不发送所有数组元素。

关于“哈西尔”:

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

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

谢谢大家

4

2 回答 2

1

除了关于数组分配的内容外,您还发送/接收错误的字节数。计数应该是 1,而不是 baris:

MPI_Send(&(hasil[0][0]),1,rowtype,master,99,MPI_COMM_WORLD);

这是因为在给定的地址 &(hasil[0][0]) (顺便说一下,这与 hasil[0] 相同)您分配了一个大小为 kolom 的数组:

hasil[t]=(int*)malloc(kolom*sizeof(int));

因此,您不能从 hasil[0] 发送超过 kolom 字节。您要么发送 kolom 整数,要么发送 1 个行类型。

另外,我真的不明白你想从每个进程发送什么以及你想把它保存在哪里?您将所有数据保存在 MPI_Recv 中的一个位置 - 在 terima[0] 中。您可以一个接一个地从不同的进程发送/接收 1 行类型的数据到 terima 的不同位置。所以你可以在master上写这个:

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);
于 2012-09-04T18:35:24.293 回答
1

我在您的 malloc 语句中看到一个明显的错误:

int **hasil;
hasil=(int**)malloc(baris*sizeof(int));

分配行时,基本上是在分配指针,因此语句应如下所示:

int **hasil;
hasil=(int**)malloc(baris*sizeof(int *));

我在分配terima.

不确定这是否会解决您的问题,但这肯定需要纠正。请试试这个,让我知道。

于 2012-09-04T04:05:51.290 回答