2012-02-22 11 views
13

Hola, me pregunto si este es el camino correcto a seguir para tener un bucle for normal pero con dos reducciones, ¿es este el enfoque correcto a continuación? ¿Esto funcionaría con más de dos reducciones también? ¿Hay una mejor manera de hacer esto? también hay alguna posibilidad de integrar esto con un comando MPI_ALLREDUCE?openmp paralelo para bucle con dos o más reducciones

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

Respuesta

19

Usted puede hacer la reducción mediante la especificación de más de una variable separados por una coma, es decir, una lista:

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

serán creados

variables de subproceso privadas para sum y result que se combinarán usando + y asignado a las variables globales originales al final del bloque de subprocesos.

Además, la variable y debe marcarse como privada.

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

+0

muchas gracias – pyCthon

+1

¿Qué pasa si hay diferentes operaciones a realizar, por ejemplo, '+' y 'max'? – worenga

+1

@mightyuhu Ver mi respuesta – Azmisov

3

sólo tiene que añadir otro reduction cláusula:

#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

No funciona en GCC 7.1. ¿Alguna idea de cómo aplicar 2 reducciones diferentes? – Royi

Cuestiones relacionadas