2009-08-19 5 views
24

Tengo un programa en C++ que usa OpenMP, que se ejecutará en varias máquinas que pueden tener o no instalado OpenMP.Ignorar OpenMP en la máquina que no lo tiene

¿Cómo pude hacer mi programa de saber si una máquina no tiene OpenMP e ignorar esos #include <omp.h>, directivas OpenMP funciones (como #pragma omp parallel ...) y/o de la biblioteca (como tid = omp_get_thread_num();)?

+1

Consulte la respuesta de Andrew. Lo mejor que puedo decir es que él es el único que realmente respondió la pregunta (y lo hizo correctamente). También vea [¿Qué preprocesador define does -fopenmp provide?] (Http://stackoverflow.com/q/30803126) – jww

Respuesta

1

OpenMP es un compilador en tiempo de ejecución y no una cosa de plataforma.

es decir. Si compila su aplicación utilizando Visual Studio 2005 o una versión superior, siempre tendrá OpenMP disponible ya que el tiempo de ejecución lo admite. (y si el usuario final no tiene instalado el tiempo de ejecución de Visual Studio C, entonces su aplicación no funcionará en absoluto).

Por lo tanto, no necesita preocuparse, si puede usarlo, siempre estará allí al igual que funciones como strcmp. Para asegurarse de que tengan el CRT, entonces puede instalar el estudio visual redistribuible.

edición:

bien, pero GCC 4.1 no será capaz de compilar su aplicación OpenMP, por lo que el problema no es la máquina de destino, pero el compilador objetivo. Como todos los compiladores tienen macros predefinidas que dan su versión, ajuste sus llamadas OpenMP con los bloques #ifdef. por ejemplo, GCC usa 3 macros para identificar la versión del compilador, __GNUC__, __GNUC_MINOR__ and __GNUC_PATCHLEVEL__

+0

Mi problema es que quiero ejecutar el programa sin multi-threading en aquellas máquinas que no lo tienen. GCC debajo de la versión 4.2.x no es compatible con OpenMP. Así que quiero hacer que mi Makefile sea capaz de decir esto y pedirle a g ++ que ignore la parte OpenMP en mi programa en lugar de fallar la compilación. ¿Alguna idea? – Tim

+3

-1: la versión del compilador es completamente inadecuada. Tanto el compilador como el tiempo de ejecución tienen que admitir openmp _y_ tiene que estar _habilitado también. La misma versión del compilador puede admitir openmp en una computadora y no admitirla en otra. –

19

Se supone que los compiladores ignoran las directivas #pragma que no entienden; ese es el objetivo de la sintaxis. Y las funciones definidas en openmp.h tienen significados simples y bien definidos en un sistema no paralelo; en particular, el archivo de encabezado comprobará si el compilador define ENABLE_OPENMP y, si no está habilitado, proporcionará las respuestas correctas.

Por lo tanto, todo lo que necesita es una copia de openmp.h para enlazar a. Aquí hay uno: http://cms.mcc.uiuc.edu/qmcdev/docs/html/OpenMP_8h-source.html.

La parte pertinente del código, sin embargo, es precisamente esta:

#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 

En el peor, puede simplemente tomar esas tres líneas y ponerlas en un archivo ficticio openmp.h, y usar eso. El resto solo funcionará.

+11

+1 para la semántica '# pragma'. -1 para 'ENABLE_OPENMP', que no cumple con los estándares. Use '_OPENMP' en su lugar. – YvesgereY

+0

* "... el archivo de cabecera comprobará si el compilador define ENABLE_OPENMP" * - No creo que esto sea cierto.¿Podría proporcionar una referencia para 'ENABLE_OPENMP'? No pude encontrarlo en el preprocesador define. Ver [¿Qué preprocesador define does -fopenmp provide?] (Http://stackoverflow.com/q/30803126) – jww

+0

Estoy compilando con clang 3.6.2 y 'clang ++ -fopenmp' me dice _OPENMP no está definido. – Arne

48

OpenMP compilación añade la definición de preprocesador "_OPENMP", por lo que puede hacer:

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

Para algunos ejemplos, véase http://bisqwit.iki.fi/story/howto/openmp/#Discussion y el código que sigue.

+5

No es necesario proteger #pragma omp, ya que dicho pragma no es intrusivo (se salta de forma segura cuando openmd no está activado). – YvesgereY

+9

Si bien es cierto, si a uno le gusta compilar sin advertencias incluso debajo de -Wall, entonces un mensaje del compilador como "warning: unknown pragma ignored" será molesto. –

+2

Acerca de la advertencia de compilación, utilizo para compilar '-Wno-unknown-pragmas' por esta misma razón. Problema: puede afectar a otros pragmas en el proyecto y eliminar advertencias útiles. –

Cuestiones relacionadas