如何启用用 Eigen 源代码编写的稀疏 matrix/dense 向量乘法的并行化?

How to enable parallelization of sparse matrix/dense vector multiplication written in Eigen source code?

根据 Eigen 文档,只要设置了正确的编译标志并定义了 OMP_NUM_THREADS=x,所有稀疏 matrix/dense 向量乘法将 运行 并行,不无论乘法发生在哪里。然而,在完成这些之后,我观察到通过检查 htop 始终只使用 1 个核心。

我关注以下源代码中的第 58 行和第 98 行,其中进行了 sm/dv 乘法运算。需要注意的是,以下代码是 Eigen 不受支持的迭代求解器模块的一部分,但我认为这一事实不会导致并行化失败。

https://eigen.tuxfamily.org/dox/unsupported/MINRES_8h_source.html

平台是Xeon Gold 6126,我使用的编译标志是

CC=g++
FLAGS=-std=c++11 -m64 -O3 -fopenmp -march=skylake-avx512

我通过以下脚本提交作业

#!/bin/bash

#something
#SBATCH -n 8
#something

OMP_NUM_THREADS=8 ./my_executable

我假设已经正确设置了 openmp。

我大致记得有人提到,为了利用多核,稀疏矩阵必须被完全填充,而不仅仅是 upper/lower 三角形。我确实只填充了上三角,不确定是否是这个原因。

我错过了什么建议?提前致谢。

这是不正确的:

as long as the proper compile flag is set and the OMP_NUM_THREADS=x is defined, all sparse matrix/dense vector multiplications will run in parallel

documentation 中所述,使用 OpenMP 的线程并行化可用于 行主要-稀疏*密集vector/matrix产品

Eigen 中 SparseMatrix 的默认存储顺序是列优先,对此并行化不适用。对于使用 OpenMP 的并行 MVP,双精度稀疏矩阵应该这样定义:

Eigen::SparseMatrix<double, Eigen::RowMajor> 

顺便说一句,没有必要指定 OMP_NUM_THREADS。此值默认设置为最大可用线程数。