20 votes

boucle for parallèle openmp avec deux réductions ou plus

Bonjour, je me demande si c'est la bonne façon de procéder pour avoir une boucle for régulière mais avec deux réductions, est-ce la bonne approche ci-dessous ? Cela fonctionnerait-il aussi avec plus de deux réductions ? Y a-t-il une meilleure façon de faire ? Y a-t-il une chance d'intégrer ceci avec une commande 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)
      }

31voto

devil Points 1049

Vous pouvez faire une réduction en spécifiant plusieurs variables séparées par une virgule, c'est-à-dire une liste :

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

Des variables de threads privés seront créées pour sum y result qui seront combinés en utilisant + et assignées aux variables globales originales à la fin du bloc de fil.

De même, les variables y doivent être marqués comme privés.

Ver https://computing.llnl.gov/tutorials/openMP/#REDUCTION

12voto

Azmisov Points 1229

Vous pouvez simplement ajouter un autre reduction clause :

#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;
}

De Spécifications complètes d'OpenMP 4.5 (Nov 2015)

Un nombre quelconque de clauses de réduction peut être spécifié sur la directive, mais mais un élément de liste ne peut apparaître qu'une seule fois dans les clauses de réduction de cette directive. directive.

La même chose fonctionne sur Visual C++ qui utilise oMP v2.0 : réduction VC++

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X