在 C++ 中并行计算多个矩阵的特征分解

计算科学 量子力学
2021-12-09 01:11:06

我正在用 C++ 编写一个程序,我试图通过并行计算多个矩阵的特征分解来减少运行时间。这可能是一个编程问题,但由于许多物理人可能会使用它,所以我在这里问这个问题。这可能是一个如何并行执行计算任务的简单示例。任何人都可以通过一个简单的例子来说明,如何做到这一点?(假设我有一个多核处理器)

2个回答

您将使用 OpenMP 之类的东西来利用线程级并行性。C ++中的一个例子就像

#pragma omp parallel for
for(int i = 0; i < num_matrices; i++){
    DoEigendecomposition(matrix[i]);
}

pragma 将自动导致每个循环迭代并行执行(假设您使用正确的标志进行编译;例如-fopenmp,对于 GCC)。在 DoEigendecomposition 中,您将为临时工作数组分配必要的内存(每个线程必须不同,因此不要将它们设为静态或共享),并调用适当的例程来执行特征分解,就像在单线程中一样核心案例(很可能在 Lapack 中用于密集矩阵,或者在一些类似 Krylov 的方法中用于稀疏)。您也可以使用 pthreads,但它的级别要低得多,您必须手动创建、同步和销毁线程。

注意:您需要确保进行特征分解的任何代码都是线程安全的(static在 C 中不使用变量,在 Fortran 中不使用COMMONSAVE块)。由于库的编译方式,Lapack 的非对称特征求解器(双精度和 zomplex 精度)通常不是线程安全的。有关详细信息,请参阅此论坛帖子免责声明:我是最初的错误报告者。

给定矩阵的特征值和特征向量的并行解决方案可以使用在线可用的包 SLEPc(构建在大型包 PETSc 之上)来执行。SLEPc 发行版中有使用示例。