我正在尝试使用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);
Run Code Online (Sandbox Code Playgroud)
这很完美,但我不能说我真的明白它是如何工作的.
MPI_Type_vector存储在内存中?MPI_Type_create_resized()工作如何以及它究竟做了什么?请记住,我是MPI的初学者.提前致谢.
假设2个进程正在参与.过程0(等级0)具有
A = { a d
b e
c f
}
Run Code Online (Sandbox Code Playgroud)
和进程1(排名1)有
A = { g
h
i
}
Run Code Online (Sandbox Code Playgroud)
我希望两个处理器都将这些列发送到0级,以便排名0在另一个2D阵列中具有以下内容.
B = { a d g
b e h
c f i
}
Run Code Online (Sandbox Code Playgroud)
我为MPI_Gatherv创建了一个新的列数据类型,我正在尝试以下代码,这让我无处可去.
我的具体问题是:
谢谢.
这是我的代码:
#include <stdio.h>
#include <mpi.h>
int main(int argc, char *argv[])
{
int numprocs, my_rank;
long int i, j;
MPI_Status status;
char **A;
char **B;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
if(my_rank == 0)
{
A = (char **)calloc((3), sizeof(char *));
B …Run Code Online (Sandbox Code Playgroud)