Как включить распараллеливание умножения разреженной матрицы / плотного вектора, записанного в исходном коде Eigen? - PullRequest
0 голосов
/ 20 октября 2019

Согласно документации 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.

Я грубо напоминаю, что кто-то упомянул, что для того, чтобы использовать преимущества нескольких ядер, разреженная матрица должна быть заполнена полностью, а не только верхним / нижним треугольником. Я действительно только заполнил только верхний треугольник, и не уверен, что это причина.

Любое предложение, что я пропустил? Заранее спасибо.

1 Ответ

1 голос
/ 21 октября 2019

Это не правильно:

, пока установлен правильный флаг компиляции и определен OMP_NUM_THREADS = x, все умножения разреженной матрицы / плотного вектора будут выполняться параллельно

Как описано в документации , распараллеливание потоков с OpenMP доступно для основных строк -sparse * плотных векторов / матричных продуктов

Порядок хранения по умолчаниюSparseMatrix в Eigen является главным столбцом, для которого распараллеливание не применяется. Для параллельных MVP с OpenMP должна быть определена разреженная матрица двойной точности, например:

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

Кстати, указывать OMP_NUM_THREADS необязательно. Это значение установлено по умолчанию для максимально доступных потоков.

...