2009-08-19 2 views
24

Ho un programma C++ che utilizza OpenMP, che verrà eseguito su diversi computer che potrebbero avere o meno OpenMP installato.Ignora OpenMP sulla macchina che non ce l'ha

Come potrei fare il mio programma di sapere se una macchina non ha OpenMP e ignorare quelle #include <omp.h>, direttive OpenMP funzioni (come #pragma omp parallel ...) e/o di libreria (come tid = omp_get_thread_num();)?

+1

Per favore vedi la risposta di Andrew. Il meglio che posso dire, è l'unico che ha effettivamente risposto alla domanda (e lo ha fatto correttamente). Vedi anche [Quale definizione del preprocessore fornisce -fopenmp?] (Http://stackoverflow.com/q/30803126) – jww

risposta

1

OpenMP è una cosa del runtime del compilatore e non una cosa della piattaforma.

ie. Se si compila l'app utilizzando Visual Studio 2005 o versione successiva, è sempre disponibile OpenMP, poiché il runtime lo supporta. (e se l'utente finale non ha installato il runtime di Visual Studio C, la tua app non funzionerà affatto).

Quindi, non è necessario preoccuparsi, se è possibile utilizzarlo, sarà sempre lì proprio come funzioni come strcmp. Per assicurarti che abbiano il CRT, puoi installare lo studio visivo ridistribuibile.

edit:

ok, ma GCC 4.1 non sarà in grado di compilare l'openMP app, in modo che il problema non è la macchina di destinazione, ma il compilatore di destinazione. Poiché tutti i compilatori hanno macro predefinite che forniscono la loro versione, avvolgono le chiamate OpenMP con i blocchi #ifdef. ad esempio, GCC utilizza 3 macro per identificare la versione del compilatore, __GNUC__, __GNUC_MINOR__ and __GNUC_PATCHLEVEL__

+0

Il mio problema è che voglio eseguire il programma senza multi-threading su quelle macchine che non ce l'hanno. GCC sotto la versione 4.2.x non supporta OpenMP. Quindi voglio rendere il mio Makefile in grado di dirlo e chiedere a g ++ di ignorare la parte OpenMP nel mio programma invece di fallire nella compilazione. Qualche idea? – Tim

+3

-1: la versione del compilatore è completamente inadeguata. Sia il compilatore che il runtime devono supportare openmp _and_ deve essere _enabled_ anche. La stessa versione del compilatore può supportare OpenMP su un computer e non supportarlo su un altro. –

19

I compilatori devono ignorare le direttive #pragma che non capiscono; questo è il punto centrale della sintassi. E le funzioni definite in openmp.h hanno significati semplici ben definiti su un sistema non parallelo - in particolare, il file di intestazione controllerà se il compilatore definisce ENABLE_OPENMP e, se non è abilitato, fornisce i fallback giusti.

Quindi, tutto ciò che serve è una copia di openmp.h da collegare a. Eccone uno: http://cms.mcc.uiuc.edu/qmcdev/docs/html/OpenMP_8h-source.html.

La parte rilevante del codice, però, è proprio questo:

#if defined(ENABLE_OPENMP) 
#include <omp.h> 
#else 
typedef int omp_int_t; 
inline omp_int_t omp_get_thread_num() { return 0;} 
inline omp_int_t omp_get_max_threads() { return 1;} 
#endif 

Nel peggiore dei casi, si può solo prendere quelle tre righe e metterli in un file fittizio openmp.h, e usare quella. Il resto funzionerà.

+11

+1 per la semantica '# pragma'. -1 per 'ENABLE_OPENMP', che non è conforme allo standard. Usa invece '_OPENMP'. – YvesgereY

+0

* "... il file di intestazione controllerà se il compilatore definisce ENABLE_OPENMP" * - Non penso che sia vero.Potresti fornire un riferimento per 'ENABLE_OPENMP'? Non riuscivo a trovarlo nel preprocessore definisce. Vedi [Quale definizione del preprocessore fornisce -fopenmp?] (Http://stackoverflow.com/q/30803126) – jww

+0

Sto compilando con clang 3.6.2 e 'clang ++ -fopenmp' mi dice _OPENMP non è definito. – Arne

48

OpenMP compilation aggiunge la definizione di preprocessore "_OPENMP", in modo da poter fare:

#if defined(_OPENMP) 
    #pragma omp ... 
#endif 

Per alcuni esempi, consultare http://bisqwit.iki.fi/story/howto/openmp/#Discussion e il codice che segue.

+5

Non è necessario proteggere #pragma omp, poiché tale pragma non è invadente (salta in modo sicuro quando openmd non è attivato). – YvesgereY

+9

Se è vero, se uno piace compilare senza avvisi anche sotto -Wall, allora un messaggio del compilatore come "warning: unknown pragma ignored" sarà fastidioso. –

+2

Informazioni sulla compilazione, io uso per compilare con '-Wno-unknown-pragmas' proprio per questo motivo. Problema: può influire su altre direttive nel progetto e rimuovere avvisi utili. –