2013-03-19 11 views
10

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:

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?

risposta

4

Questa è una domanda interessante. Fondamentalmente, si desidera modificare la politica schedule in fase di esecuzione. Per quanto ne so, non esiste una direttiva di questo tipo per l'attuale OpenMP.

Ho avuto esattamente lo stesso problema che hai fatto. La mia soluzione ha finito per rendere il corpo del ciclo come una funzione, come hai detto. Altrimenti, devi usare una brutta macro.

Tuttavia, ho anche provato a utilizzare schedule(runtime), che legge la variabile di ambiente OMP_SCHEDULE. Così, ho cambiato questa variabile d'ambiente in fase di esecuzione, ma non ha funzionato. È perché il runtime di OpenMP legge questo ambiente solo una volta all'inizio. Potrebbe trattarsi di un problema specifico dell'implementazione. Quindi, altre implementazioni possono leggere al volo questa variabile d'ambiente. Puoi provare questo approccio.

+0

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! –