MPI上求矩阵行列式方法的并行化

Posted

技术标签:

【中文标题】MPI上求矩阵行列式方法的并行化【英文标题】:Parallelization of the method for finding the determinant of a matrix on MPI 【发布时间】:2022-01-11 21:43:13 【问题描述】:

如何实现并行化在 MPI 上查找矩阵行列式的方法?如何并行化矩阵的填充,是否可以将数据从前一个进程传递到每个进程,以及如何将其应用于我的代码?

double GaussDet(double** mat, int size) 

    int determinant = 1;

    for (int i = 1; i < size; ++i)
    
        for (int k = i; k < size; ++k)
        
            for (int j = size - 1; j >= 0; --j)
            
                mat[k][j] -= mat[k][i - 1] / mat[i - 1][i - 1] * mat[i - 1][j];
            
        
    

    for (int i = 0; i < size; i++) 
      for(int j = 0; j < size; j++) 
        if(i == j)
        determinant *= mat[i][j];
      
    
    return determinant;


int main(int argc, const char * argv[])
 
    srand(time(NULL));
    int N = 4;

    double **matrix = malloc(N * sizeof(double*));
    for (int i = 0; i < N; i++) 
      matrix[i] = malloc(N * sizeof(double*));
    
    fill_matrix(matrix, N);
    print_matrix(matrix, N);
    double det = GaussDet(matrix, N);
    print_matrix(matrix, N);
    printf("det = %f\n", det);
 

【问题讨论】:

int determinant = 1; 很奇怪。为什么int 避免matrix[i] = malloc(N * sizeof(double*)); 中的大小错误。而是将大小设置为引用值:matrix[i] = malloc(N * sizeof matrix[i][0]);. "如何将它应用到我的代码中?" --> 我建议先让代码作为一个进程正确运行,然后再尝试多个进程。 所以他做对了。或者如果有错误在哪里?除了记忆,我更正了它 【参考方案1】:

您正在描述通过简化为上三角形式,然后将对角线上的元素相乘来计算行列式。上三角归约是高斯消元(或:计算 LU 分解)的基础,所以让我们假设这就是您所要求的。

好的,所以你有一个矩阵和 MPI。 MPI 使用分布式内存,因此为了实现良好的实现,您需要分发矩阵。最简单的解决方案是让每个进程存储许多不同的行。列也是可能的,但这对论点没有影响。

高斯消元有很多并行性,但它有一个顺序组件:1/a[i,i] 枢轴的计算。您为i 的一个值执行此操作,更新所有矩阵元素,为下一个i 执行此操作,等等。需要注意的重要一点是,只有一个进程存储了该元素,因此只有一个进程知道枢轴的值。因此,该过程必须将其广播给所有其他人。然后每个人都可以更新他们的矩阵元素。

从编码开始:每个进程得到矩阵的一个切片,然后你计算分解。

现在,这个算法有问题:在你消除了 pivot i 之后,存储它的进程不再活动。所以在分解的过程中,你的并行度会越来越少。您可以通过为每个进程提供不是矩阵的块切片,而是通过循环来解决此问题。还有一个更难描述的问题,即将整行分配给进程的基本假设。

因此,这种算法的高质量实现非常罕见。 Scalapack 和 PLapack(都是 1990 年代),然后是 Elemental(2010 年代),实际上几乎只有它们。去显示这个问题是多么棘手。但正如我上面概述的那样,基础应该是可行的。

【讨论】:

好的,谢谢,你能告诉我在哪里可以阅读,例如关于快速排序的并行性吗? 我找到了一个例子,但是效果很差,例如,对于 50-100 个元素,它只是显示错误或具有未知值的数组link 如果你想学习 MPI,你就走错了路。使用 MPI 进行快速排序非常。那你想做什么? (顺便说一句,感谢您支持并接受我的回答。提示。) 你意识到快速排序是一个完全不同的问题? 是的,我明白了。不,我不学习 MPI,但课程项目的分配与之相关。有几个选项,我认为快速排序可能更容易,因为即使代码也在互联网上,但事实证明,它只适用于示例中的数据。我可以创建一个关于她的新问题吗?值得吗?

以上是关于MPI上求矩阵行列式方法的并行化的主要内容,如果未能解决你的问题,请参考以下文章

初等矩阵的行列式怎么求?

三元组矩阵行列式的计算(用递归)

非常大矩阵的行列式值

如何用MATLAB计算矩阵的行列式

如何计算 scipy 稀疏矩阵行列式而不将其变为密集?

Canvas 行列式与矩阵基础