首页 > 解决方案 > MPI allReduce 迭代

问题描述

我在使用 MPI_allReduce 时遇到问题,我必须在每次迭代后更新矩阵 R_T、R_T_original,因为矩阵 R_T 在每个进程中都是相同的,但矩阵 mid_L、mid_B、mid_A 对于每个进程是不同的。在我的示例中,矩阵 A、B、L 有 3 行,我有 3 个进程,每个进程都有一行矩阵(A,L,B),不为零的变量有 3 个不同的值(P0--> 不为零=2,P1-->nozero=2,P2--> nozero=3),在我的调试输出中,我收到结果,直到 i=1 并且程序进入不确定阶段。我认为进程 P2 必须计算迭代 i=2,而进程 P0 和 P1 已经终止迭代 i。我该如何解决这个问题?

double sub = 0;
   for(int i=0; i<no_zero; i++){
      sub=alpha2*(mid_A[rows_nz[i]][cols_nz[i]]-mid_B[rows_nz[i]][cols_nz[i]]);

    for(int k=0; k<nF;k++){
        mid_L[rows_nz[i]][k] = mid_L[rows_nz[i]][k]-sub*(-R_T_original[cols_nz[i]][k]);


    MPI_Allreduce(&R_T[0][0], &appo[0][0], nI*nF, MPI_DOUBLE, MPI_MAX, MPI_COMM_WORLD);


        matrixcopy(R_T, appo, nI, nF);

        R_T[cols_nz[i]][k] = R_T[cols_nz[i]][k]-sub*(-mid_L_original[rows_nz[i]][k]);


    }
}



 // Clone matrix
 matrixcopy(mid_L_original, mid_L, dim_L, nF);
 matrixcopy(R_T_original, R_T, nI, nF);

}

标签: cmatrixmpi

解决方案


有时使用集体 MPI 操作可能会很棘手。您MPI_Allreduce在循环中调用,但由于non_zerorank 的值因排名而异,并非所有排名都对 进行相同次数的调用MPI_Allreduce。当 P2 进行迭代i = 2时,它MPI_Allreduce在内部循环中调用,并且永远阻塞等待 P0 和 P1 进行相同的 all-reduce 调用,但它们不会,因为循环在这些等级中的迭代次数减少了。

为了使 MPI 程序对于诸如 的集体操作是正确的MPI_Allreduce,所涉及的通信器中的每个等级必须以相同的次数和相同的顺序调用相同的集体操作。

您需要重新考虑您的算法并平衡MPI_Allreduce所有等级的调用次数,或者更好地解释您正在尝试实现的数学计算。


推荐阅读