Domanda

Nel mio programma C ++, mi piacerebbe fare il suo eseguibile a volte con ed a volte senza usare OpenMP (vale a dire il multi-threading o single-threading). Sto considerando una delle seguenti due casi come il mio codice sta usando OpenMP:

(1) Si supponga che il mio codice sta avendo solo direttive #include <omp.h> e OpenMP.

(2) Come (1) e il mio codice chiama ulteriori funzioni OpenMP come omp_get_thread_num().

Al fine di non avere codice diverso per la corsa diversa, è l'unico modo con qualche variabile precompilatore auto-definita a guardia dove OpenMP appare nel mio codice?

Grazie e saluti!

È stato utile?

Soluzione

Ciao il modo più semplice per farlo è

omp_set_num_threads(m_iUseableProcessors);

dove m_iUseableProcessors è il numero di processori che si desidera dividere il calcolo. Io non so come farlo senza le funzioni OpenMP. Si potrebbe probabilmente li #ifdef fuori, ma che fa spegnere OpenMP in fase di compilazione.

Altri suggerimenti

È possibile utilizzare la variabile d'ambiente:

set OMP_NUM_THREADS=1

In realtà, non si accende OpenMP off. Forzerà OpenMP per creare un solo filo per un'applicazione. Funziona senza ricompilazione. Uso questa variabile per testare la scalabilità su 1, 2, 3, 4, ecc fili.

È possibile inserire il includono quanto segue:

#ifdef _OPENMP_
#include<omp.h> 
#endif

Ora, se si esegue il programma senza bandiera -fopenmp, sarebbe ignorare le direttive OpenMP

Oltre alla suggestione del _OPENMP, si potrebbe trovare utile utilizzare _Pragma di C99 (o __pragma, se si utilizzano alcuni compilatori C ++ - vedere questa domanda StackOverflow per i dettagli) per evitare che il codice venga disseminato di #ifdef _OPENMP e #endif, riducendo in tal modo le linee associate con la compilazione condizionale da 3x, e in caso contrario dando O (1) il controllo su O (n) casi di annotazioni OpenMP.

Per esempio, io uso il seguente stile nei miei codici C99 OpenMP. I cambiamenti di sostegno C ++ dovrebbe essere abbastanza modesto, anche se eventualmente compilatore-specifico (in questo caso, come macro __GNUC__, __clang__, __INTEL_COMPILER, ecc può essere utile).

#ifndef PRAGMA_OPENMP_H
#define PRAGMA_OPENMP_H

#if defined(_OPENMP) && ( __STDC_VERSION__ >= 199901L )

#define PRAGMA(x) _Pragma(#x)

#define OMP_PARALLEL PRAGMA(omp parallel)
#define OMP_PARALLEL_FOR PRAGMA(omp parallel for schedule(static))
#define OMP_FOR PRAGMA(omp for schedule(static))

#define OMP_PARALLEL_FOR_COLLAPSE(n) PRAGMA(omp parallel for collapse(n) schedule(static))
#define OMP_PARALLEL_FOR_COLLAPSE2 OMP_PARALLEL_FOR_COLLAPSE(2)
#define OMP_PARALLEL_FOR_COLLAPSE3 OMP_PARALLEL_FOR_COLLAPSE(3)
#define OMP_PARALLEL_FOR_COLLAPSE4 OMP_PARALLEL_FOR_COLLAPSE(4)

#define OMP_PARALLEL_FOR_REDUCE_ADD(r) PRAGMA(omp parallel for reduction (+ : r) schedule(static))

#else

#warning No OpenMP, either because compiler does not understand OpenMP or C99 _Pragma.

#define OMP_PARALLEL
#define OMP_PARALLEL_FOR
#define OMP_FOR
#define OMP_PARALLEL_FOR_COLLAPSE(n)
#define OMP_PARALLEL_FOR_COLLAPSE2
#define OMP_PARALLEL_FOR_COLLAPSE3
#define OMP_PARALLEL_FOR_COLLAPSE4
#define OMP_PARALLEL_FOR_REDUCE_ADD(r)

#endif

#endif // PRAGMA_OPENMP_H
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top