Согласно документации 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.
Я грубо напоминаю, что кто-то упомянул, что для того, чтобы использовать преимущества нескольких ядер, разреженная матрица должна быть заполнена полностью, а не только верхним / нижним треугольником. Я действительно только заполнил только верхний треугольник, и не уверен, что это причина.
Любое предложение, что я пропустил? Заранее спасибо.