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