2011-10-21 8 views
15

Ho codice C++ con i prugmi OpenMP all'interno. Voglio testare questo codice sia per la modalità multithread (con OpenMP) sia per la modalità single thread (senza OpenMP).Come disabilitare le direttive OpenMP in modo piacevole?

Per ora, per passare da una modalità all'altra ho bisogno di commentare #pragma omp (o almeno parallel).

Qual è il modo più pulito o predefinito per abilitare/disabilitare OpenMP?

risposta

10

Consultare il manuale del compilatore per lo switch che disabilita OpenMP. Per GCC, OpenMP è disabilitato per impostazione predefinita e abilitato con l'opzione -fopenmp.

Un'altra opzione sarebbe quella di eseguire il codice con la variabile di ambiente OMP_NUM_THREADS impostata su 1, anche se non è esattamente la stessa cosa di compilare senza OpenMP in primo luogo.

+0

scrittura di codice con "#pragma omp ..." e poi _non_ consentendo -fopenmp cause che collegano erros come "undefined reference to GOMP_parallel_start" –

+4

Ho trovato 'omp_set_num_threads (1)' la più utile (purtroppo, non è molto elegante nella mia opinione) –

+0

Per il nostro progetto abbiamo WITH_OPENMP - un'opzione di tempo di compilazione booleana che gestisce il passaggio -fopenmp e qualsiasi definisce se sono necessari. Id suggerire questo a chiunque stia usando openmp in un progetto, la possibilità di testare senza openmp può essere utile a volte per escluderlo come causa di eventuali bug. – ideasman42

2

Il modo in cui queste cose sono di solito gestite (caso generale) è con #define s e #ifdef:

Nel file di intestazione:

#ifndef SINGLETHREADED 
#pragma omp 
#endif 

Quando si compila, aggiungere -DSINGLETHREADED per disabilitare OpenMP:

cc -DSINGLETHREADED <other flags go here> code.c 
25

Se non si compila con l'opzione -fopenmp, non si otterrà il codice parallelo. Puoi farlo con una definizione e un makefile appropriati che generano tutti i codici.

La documentazione OpenMP dice (solo un esempio):

#ifdef _OPENMP 
    #include <omp.h> 
#else 
    #define omp_get_thread_num() 0 
#endif 

Vedi http://www.openmp.org/mp-documents/spec30.pdf (compilazione condizionale).

+0

Il condizionale sopra riportato funziona ancora senza fornire la dichiarazione else. – sinner

Problemi correlati