2011-09-14 20 views
11

Sto usando OpenMP per migliorare l'efficienza del programma sui loop.OpenMP: uso condizionale di #pragma

Ma recentemente ho scoperto che su piccoli loop l'uso di questa libreria diminuiva le prestazioni e che l'utilizzo del modo normale era migliore.

In effetti, mi piacerebbe usare openMP solo se una condizione è soddisfatta, il mio codice è

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

Ma quello che voglio fare è quello di disabilitare il #pragma se dimensioni è abbastanza piccolo vale a dire:

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

ma non funziona, il modo migliore è quello di scrivere il loop due volte, ma non voglio fare in quel modo ...

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

Qual è il modo migliore per farlo?

risposta

7

penso che si dovrebbe essere in grado di ottenere l'effetto che stai cercando utilizzando l'opzionale schedule clause sulla direttiva parallel for:

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

si potrebbe desiderare di giocare con diversi tipi di pianificazione e anche se diverso dimensioni del blocco per vedere cosa si adatta meglio alle tue routine di libreria.

+11

Ho usato #pragma omp parallelo per if (size> = OMP_MIN_VALUE) – Arthur