我正在尝试使用 MPI 编写矩阵向量乘法程序。我正在尝试将矩阵的列发送到单独的进程并在本地计算结果。最后我做了一个MPI_Reduce
使用MPI_SUM
操作。
发送矩阵的行很容易,因为 C 以行优先顺序存储数组,但列不是(如果您不逐个发送它们)。我在这里读到了这个问题:
Jonathan Dursi 建议使用新的 MPI 数据类型,这就是我根据自己的需要调整他的代码所做的:
double matrix[10][10];
double mytype[10][10];
int part_size; // stores how many cols a process needs to work on
MPI_Datatype col, coltype;
// ...
MPI_Type_vector(N, 1, N, MPI_DOUBLE, &col);
MPI_Type_commit(&col);
MPI_Type_create_resized(col, 0, 1*sizeof(double), &coltype);
MPI_Type_commit(&coltype);
// ...
MPI_Scatter(matrix, part_size, coltype,
mypart, part_size, coltype,
0, MPI_COMM_WORLD);
// calculations...
MPI_Reduce(local_result, global_result,
N, MPI_DOUBLE,
MPI_SUM,
0, MPI_COMM_WORLD);
这工作得很好,但我不能说我真的理解它是如何工作的。
- 是如何
MPI_Type_vector
存储在内存中的? - 它是如何
MPI_Type_create_resized()
工作的,它到底是做什么的?
请记住,我是 MPI 的初学者。提前致谢。