MPI收集以错误的顺序返回结果

时间:2015-03-15 11:52:39

标签: c matrix parallel-processing mpi

我试图将矩阵乘以矩阵(A * B)与MPI相乘。我将矩阵B分成列B = [b1,... bn]并进行一系列乘法ci = A * bi。问题是,然后我收集他们订购的结果列有时似乎是错误的。所以,而不是 [c1,... cn]我得到了,例如,[c2,c1,c4,..]。

MPI_Scatter(matrix,MM,MPI_INT,part_of_matrix,MM,MPI_INT,0,MPI_COMM_WORLD);

for (i=0; i<n; i++)  {
    get_block_of_matrix(block,part_of_matrix,M,n,i);
    matvect(tmp,val,I,J,M,nnz,block);
    for (j=0; j<M; j++)
        result[M*i+j]=tmp[j];
}


MPI_Gather(result, MM, MPI_INT, res, MM, MPI_INT, 0, MPI_COMM_WORLD);

2 个答案:

答案 0 :(得分:1)

上述代码段中的问题并不明显。查看完整的源代码会引导我进入函数takevect。内部索引是错误的,它应该是这样的:

void takevect(int *temp,int *matr, int size1, int size2, int i) {
   int j;
   for (j=0; j<size1; j++) temp[j]=matr[size1*i+j];
}

使用1个流程时很幸运,因为size1等于size2(且matr是对称的)。 可以看出,不再需要size2

此外,您可以完全删除此功能并缩短内容,如下所示:

MPI_Scatter(S,MM,MPI_INT,buf_S,MM,MPI_INT,0,MPI_COMM_WORLD);

for (i=0; i<local_n; i++)
   matvect(buf_res+i*M,val,I,J,M,nnz,buf_S+i*M);

MPI_Gather(buf_res, MM, MPI_INT, res, MM, MPI_INT, 0, MPI_COMM_WORLD);

答案 1 :(得分:0)

您的索引已关闭。这一行:

 result[M*i+j]=tmp[j];

应该阅读

 result[n*i+j]=tmp[j];