Подтвердить что ты не робот

Openmp параллельно для цикла с двумя или более сокращениями

Привет, просто задаюсь вопросом, правильно ли это, если вы собираетесь иметь регулярный цикл, но с двумя сокращениями, это правильный подход ниже? Будет ли это работать с более чем двумя сокращениями. Есть лучший способ сделать это? также есть ли возможность интегрировать это с помощью команды MPI_ALLREDUCE?

heres the psuedo code

     #pragma omp parallel for    \
      default(shared) private(i) \
   //todo first  reduction(+:sum)
   //todo second reduction(+:result)

            for loop i < n; i ++; {
             y = fun(x,z,i)
              sum += fun2(y,x)
              result += fun3(y,z)
    }
4b9b3361

Ответ 1

Вы можете сделать уменьшение, указав более одной переменной, разделенной запятой, то есть список:

#pragma omp parallel for default(shared) reduction(+:sum,result) ...

Для sum и result будут созданы переменные частного потока, которые будут объединены с помощью + и назначены исходным глобальным переменным в конце блока потока.

Кроме того, переменная y должна быть помечена как закрытая.

См. https://computing.llnl.gov/tutorials/openMP/#REDUCTION

Ответ 2

Вы можете просто добавить другое предложение reduction:

#include <iostream>
#include <cmath>

int main(){
    double sum_i = 0, max_i = -1;
    #pragma omp parallel for reduction(+:sum_i), reduction(max:max_i)
    for (int i=0; i<5000; i++){
        sum_i += i;
        if (i > max_i)
            max_i = i;
    }
    std::cout << "Sum = " << sum_i << std::endl;
    std::cout << "Max = " << max_i << std::endl;
    return 0;
}