Ho un ciclo for che può essere eseguito utilizzando schedule(static)
o schedule(dynamic, 10)
a seconda di una condizione. Attualmente, il mio codice non è asciutto (non ripeterti) abbastanza e per accogliere la funzionalità precedente ha il seguente ripetizione:openMP condizionale pragma "if else"
boolean isDynamic; //can be true or false
if(isDynamic){
#pragma omp parallel for num_threads(thread_count) default(shared) private(...) schedule(dynamic, 10)
for(...){
//for code inside
}
}else{
#pragma omp parallel for num_threads(thread_count) default(shared) private(...) schedule(static)
for(...){
//SAME for code inside, in fact, this is the EXACT same for as before
}
}
Dopo aver letto questi fili, ho notato che ha un openMP #if(expression)
pragma:
- OpenMP: conditional use of #pragma
- http://msdn.microsoft.com/en-us/library/5187hzke.aspx
- Choose OpenMP pragma according to condition
- Conditional "pragma omp"
- http://openmp.org/mp-documents/ntu-vanderpas.pdf
Ma anche se ho visto molte persone con il mio problema, non sembra mancare una soluzione generale. La soluzione migliore è trasformare il corpo del ciclo for in una funzione, quindi chiamare la funzione, ma questa soluzione non è abbastanza buona per me.
Quindi mi chiedo, OpenMP ha un tipo di pragma #if(expression) else
? Qualcosa di simile:
#if(isDynamic)pragma omp parallel for num_threads(thread_count) default(shared)
private(...) schedule(dynamic, 10)
else
pragma omp parallel for num_threads(thread_count) default(shared)
private(...) schedule(static)
Oppure io sono costretto a mettere la mia per il corpo del ciclo in una funzione separata e chiamarlo in quel modo?
Presumo che tu stia parlando di questo suggerimento (http://stackoverflow.com/questions/4085595/conditional-pragma-omp/4087196#4087196). Tbh, non penso nemmeno che compili, OMP_FOR non è nemmeno definito. Per quanto riguarda OMP_SCHEDULE, non ne avevo idea. Proverò a guardarmi intorno e vedere cosa riesco a trovare, grazie! –