Matrix 将所有由mpi计算的矩阵行收集到根矩阵

Matrix 将所有由mpi计算的矩阵行收集到根矩阵,matrix,mpi,Matrix,Mpi,我整天都在努力在MPI的帮助下实现矩阵乘法,所有来自互联网的例子都不适合我(我不知道为什么,它编译、运行但不计算)。以下是我正在做的: 来自bash: MPI运行-n 2输出/lb8 它读取矩阵2x4(每个进程1行)并开始计算。 问题在SendRecv块中(或通常在收集数据时) 无效矩阵(双**矩阵a,双**矩阵b,双***矩阵c,整数行,整数列){ int i,j; int进程排名,进程计数; MPI通信等级(MPI通信世界和过程等级); MPI通信大小(MPI通信世界和进程计数); 如果(a

我整天都在努力在MPI的帮助下实现矩阵乘法,所有来自互联网的例子都不适合我(我不知道为什么,它编译、运行但不计算)。以下是我正在做的:

来自bash:

MPI运行-n 2输出/lb8

它读取矩阵2x4(每个进程1行)并开始计算。 问题在SendRecv块中(或通常在收集数据时)

无效矩阵(双**矩阵a,双**矩阵b,双***矩阵c,整数行,整数列){
int i,j;
int进程排名,进程计数;
MPI通信等级(MPI通信世界和过程等级);
MPI通信大小(MPI通信世界和进程计数);
如果(a_行%process_count!=0){
错误代码=未按等级划分异常;
返回;
}
int rows\u per\u process=行/进程计数;
int current_row=每个进程的行数*进程排名;
双**温度;
temp=(双**)malloc(sizeof(双*)*a_行);
对于(i=0;i
这个解决方案适合我

....
        if (process_rank != ROOT)
        MPI_Send(temp[i], a_rows, MPI_DOUBLE, ROOT, i, MPI_COMM_WORLD);
}

if (process_rank == ROOT) {
    for (i = 1; i < process_count; ++i)
    {
        for (j = i * rows_per_process; j < i * rows_per_process + rows_per_process; ++j)
        {
            MPI_Recv(temp[j], a_rows, MPI_DOUBLE, i, j, MPI_COMM_WORLD, MPI_STATUSES_IGNORE);
        }
    }
}

*matrix_c = temp;
。。。。
if(进程等级!=根)
MPI_发送(临时[i],a_行,MPI_双精度,根,i,MPI_通信世界);
}
if(进程_秩==根){
对于(i=1;i
....
        if (process_rank != ROOT)
        MPI_Send(temp[i], a_rows, MPI_DOUBLE, ROOT, i, MPI_COMM_WORLD);
}

if (process_rank == ROOT) {
    for (i = 1; i < process_count; ++i)
    {
        for (j = i * rows_per_process; j < i * rows_per_process + rows_per_process; ++j)
        {
            MPI_Recv(temp[j], a_rows, MPI_DOUBLE, i, j, MPI_COMM_WORLD, MPI_STATUSES_IGNORE);
        }
    }
}

*matrix_c = temp;