Проблемы с производительностью OpenMP в Armadillo: .each_slice () и .for_each () - PullRequest
0 голосов
/ 29 августа 2018

Я в настоящее время нахожусь в проекте, который включает несколько операций над кусочками и полями Armadillo Cube, которые можно легко распараллелить. Я хочу воспользоваться лямбда-функциями в Armadillo с помощью .each_slice () и .for_each () и повысить производительность, активировав флаг OpenMP. Я вообще не смог повысить свой код (см. Пример ниже), и на самом деле активация OpenMP, как оказалось, замедлила моё моделирование (как на моем ноутбуке macOS (clang ++ -Xpreprocessor -fopenmp -lomp), так и gcc (- fopnemp) компиляторы в университетском кластере на базе Linux).

Я хотел бы понять, при каких обстоятельствах рекомендуется использовать openMP в этих функциях:

1) Я понимаю, что многопоточные операции выгодны только тогда, когда базовые массивы достаточно велики. Насколько важно количество срезов и размеры базовых матриц (в кубе)? Какие разумные цифры для рассмотрения OpenMP?

2) Флаги ARMA_OPENMP_THREADS, ARMA_OPENMP_THRESHOLD относятся к поэлементным операциям. Имеют ли они какой-либо эффект в .each_slice () или .for_each () вообще?

Пример

Я заменил следующий цикл:

for(uword j=0; j<d_in; ++j){                        

    mycube.slice(j) = A * mycube.slice(j);
}

по заявлению:

mycube.each_slice( [Ai_remainder] (cmat& X) {X = A*X;} ,OMPstatus);    

где A - это просто матрица того же типа, что и базовый куб, а OMPstatus - просто логическая переменная для активации (деактивации) OpenMP.

...