Pregunta

En mi programa en C ++, me gustaría seguir su ejecutable a veces con ya veces sin usar OpenMP (es decir, multi-threading o de un solo enhebrar). Estoy considerando cualquiera de los dos casos siguientes cómo mi código está utilizando OpenMP:

(1) Supongamos que mi código es sólo tener directivas #include <omp.h> y OpenMP.

(2) Lo mismo que (1) y mi código llama aún más las funciones de OpenMP como omp_get_thread_num().

Con el fin de no tener código diferente para diferentes en marcha, es que la única manera de utilizar alguna variable precompilador autodefinido para custodiar donde aparece OpenMP en mi código?

Gracias y saludos!

¿Fue útil?

Solución

Hola la manera más fácil de hacer esto es

omp_set_num_threads(m_iUseableProcessors);

donde m_iUseableProcessors es el número de procesadores que desea dividir el cálculo más. No sé cómo hacerlo sin las funciones de OpenMP. Probablemente se podría #ifdef a cabo, pero eso hace que apague OpenMP en tiempo de compilación.

Otros consejos

Puede utilizar la variable de entorno:

set OMP_NUM_THREADS=1

En realidad, no se enciende fuera OpenMP. Que obligará a OpenMP para crear un solo hilo para una aplicación. Funciona sin recompilación. I utilizar esta variable para probar la escalabilidad en 1, 2, 3, 4, etc hilos.

Puede poner la incluyen los siguientes:

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

Ahora bien, si se ejecuta el programa sin bandera -fopenmp, sería ignorar las directivas OpenMP

Además de la sugerencia de _OPENMP, puede que le resulte útil el uso de _Pragma de C99 (o __pragma, si utiliza algunos compiladores de C ++ - vea esta pregunta StackOverflow para más detalles) para evitar que su código sea lleno de #ifdef _OPENMP y #endif, lo que reduce las líneas asociadas con la compilación condicional por 3 veces, y de otra manera que le da O (1) control sobre O) n (casos de anotaciones OpenMP.

Por ejemplo, utilizo el siguiente estilo en mis códigos C99 OpenMP. Los cambios para apoyar C ++ debe ser bastante modesta, aunque posiblemente compilador-específica (en cuyo caso, las macros como __GNUC__, __clang__, __INTEL_COMPILER, etc. puede ser útil).

#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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top