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

标签 c matrix parallel-processing mpi

我正在尝试使用 MPI 将矩阵乘以矩阵 (A*B)。我将矩阵 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);

最佳答案

从上面的代码片段来看,问题并不明显。查看完整的源代码,我找到了函数 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);

关于c - MPI 收集以错误的顺序返回结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29060283/

相关文章:

c++ - 如何使用 tpl 序列化 "std::string"

c++ - 如何正确评论

java - 如何使用 Java 中的多线程实现 2D 方阵乘法?

python - 使用 MPI 的 Allreduce 对 Python 对象求和

java - Java ExecutorService 上的 Fibonacci 顺序运行比并行运行更快

scala - Scala 的 Actor 是否有任何非阻塞 IO 开源实现?

c - 类型转换为 char 后打印单个字节

在 C 中将字符转换为字符串

python - 试图构建单位矩阵?

c++ - 列和行交换的最佳稀疏矩阵表示