2012-02-22 15 views
13

Ciao, mi chiedo solo se questo è il modo giusto per fare un ciclo regolare, ma con due riduzioni, è l'approccio giusto qui sotto? Funzionerebbe anche con più di due riduzioni. C'è un modo migliore per farlo? c'è anche qualche possibilità di integrare questo con un comando MPI_ALLREDUCE?openmp parallelo per loop con due o più riduzioni

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) 
     } 

risposta

19

Si può fare la riduzione specificando più di una variabile separati da una virgola, vale a dire un elenco:

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

variabili filo privati ​​saranno creati per sum e result che saranno combinati con + e assegnato alle variabili globali originali alla fine del blocco di thread.

Inoltre, la variabile deve essere contrassegnata come privata.

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

+0

vi ringrazio molto – pyCthon

+1

E se ci sono diverse operazioni da eseguire per esempio '+' e 'max'? – worenga

+1

@mightyuhu Vedere la mia risposta – Azmisov

3

si può semplicemente aggiungere un altro reduction clausola:

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

Non funziona in GCC 7.1. Qualche idea su come applicare 2 riduzioni diverse? – Royi

Problemi correlati