【问题标题】:How to enable parallelization of sparse matrix/dense vector multiplication written in Eigen source code?如何启用用 Eigen 源代码编写的稀疏矩阵/密集向量乘法的并行化?
【发布时间】:2019-10-20 19:45:03
【问题描述】:

根据 Eigen 文档,只要设置了正确的编译标志并定义了 OMP_NUM_THREADS=x,所有稀疏矩阵/密集向量乘法将并行运行,无论乘法发生在何处。然而,在完成这些之后,我观察到通过检查 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。

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

有什么我错过的建议吗?提前致谢。

【问题讨论】:

  • 提醒遇到类似问题的人:稀疏矩阵必须完全填充,这意味着仅填充上/下三角形不会启用并行化。

标签: eigen eigen3


【解决方案1】:

这是不正确的:

只要设置了正确的编译标志并定义了 OMP_NUM_THREADS=x,所有稀疏矩阵/密集向量乘法将并行运行

documentation 中所述,使用 OpenMP 进行线程并行化可用于 row-major-sparse * 密集向量/矩阵乘积

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

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

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

【讨论】:

  • 你完全正确。我现在可以在使用 RowMajor 稀疏矩阵后观察并行化。
猜你喜欢
  • 2021-07-18
  • 2021-01-31
  • 2021-12-18
  • 2013-05-24
  • 1970-01-01
  • 1970-01-01
  • 2019-09-28
  • 2014-03-06
  • 1970-01-01
相关资源
最近更新 更多