openmp параллельный для цикла с двумя или более сокращениями - PullRequest
15 голосов
/ 22 февраля 2012

Привет, просто интересно, правильно ли это использовать регулярный цикл for, но с двумя сокращениями, это правильный подход ниже?Будет ли это работать с более чем двумя сокращениями?Есть лучший способ сделать это?также есть ли шанс интегрировать это с командой 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)
      }

Ответы [ 2 ]

26 голосов
/ 22 февраля 2012

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

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

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

Также переменная y должна быть помечена как приватная.

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

7 голосов
/ 17 мая 2016

Вы можете просто добавить еще одно предложение 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;
}

С Полные спецификации OpenMP 4.5 (ноябрь 2015 г.)

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

То же самое работает в Visual C ++, который использует oMP v2.0: сокращениеVC ++

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...