2011-09-14 24 views
11

Estoy usando OpenMP para mejorar la eficiencia de mi programa en loops.OpenMP: uso condicional de #pragma

Pero recientemente descubrí que en los bucles pequeños el uso de esta biblioteca disminuía el rendimiento y que el uso normal era mejor.

De hecho, me gustaría utilizar OpenMP sólo si se cumple una condición, mi código es

#pragma omp parallel for 
for (unsigned i = 0; i < size; ++i) 
    do_some_stuff(); 

Pero lo que yo quiero hacer es desactivar el #pragma si tamaño es lo suficientemente pequeño es decir:

if (size > OMP_MIN_VALUE) 
    #pragma omp parallel for 
for (unsigned i = 0; i < size; ++i) 
do_some_stuff(); 

pero no funciona, la mejor manera es escribir el bucle dos veces, pero no quiero hacer de esa manera ...

if (size > OMP_MIN_VALUE) 
{ 
    #pragma omp parallel for 
    for (unsigned i = 0; i < size; ++i) 
    do_some_stuff(); 
} 
else 
{ 
    for (unsigned i = 0; i < size; ++i) 
    do_some_stuff(); 
} 

¿Cuál es la mejor manera de hacerlo?

Respuesta

7

creo que debería ser capaz de lograr el efecto que está buscando usando la opción schedule clause en su parallel for Directiva:

#pragma omp parallel for schedule(static, OMP_MIN_VALUE) 
for (unsigned i = 0; i < size; ++i) 
    do_some_stuff(); 

Es posible que desee jugar con diferentes tipos de programación y aunque diferente tamaños de trozos para ver lo que mejor se adapta a las rutinas de tu biblioteca.

+11

Utilicé #pragma omp parallel para if (size> = OMP_MIN_VALUE) – Arthur