управление условным Openmp в макросе #define - PullRequest
1 голос
/ 22 июня 2019

Я хочу использовать флаг #define для управления использованием openmp или нет. Поскольку #pragma не может быть внутри #define, поэтому я попытался

#define USE_OPENMP  // Toggle this on/off

#ifdef USE_OPENMP
    #define OMP_FOR(n)   __pragma("omp parallel for if(n>10)") 
#else
    #define OMP_FOR(n)   // do nothing        
#endif

тогда в моем коде я могу:

int size_of_the_loop = 11;
OMP_FOR(size_of_the_loop) // activate openmp if(n>10)
for(){
    //do stuff
}

Я не знаком с вещами, связанными с * 1010, и задаюсь вопросом, возможно ли достичь этого? Спасибо.

Ответы [ 2 ]

2 голосов
/ 23 июня 2019

Компиляторы OpenMP должны определить _OPENMP согласно спецификации OpenMP, как указано в одном из комментариев.

Поскольку директивы OpenMP основаны на прагмах, компилятор должен игнорировать директивы OpenMP, если он не поддерживает OpenMP или если OpenMP не включен с помощью переключателей компилятора. Таким образом, если вы не полагаетесь на вызовы API времени выполнения OpenMP, обычно нет необходимости использовать _OPENMP в большинстве кодов.

РЕДАКТИРОВАТЬ: Совет по обзору архитектуры OpenMP публикует библиотеку заглушек в https://github.com/OpenMP/sources в качестве исходного кода. Эта библиотека заглушек может использоваться для предоставления символов библиотеки времени выполнения API OpenMP и получения заглушек «no op», которые правильно реализуют семантику для однопоточного выполнения.

2 голосов
/ 22 июня 2019

Компилятор Microsoft определит макрос _OPENMP, если установлена ​​опция компилятора /openmp. Для вашей цели вы можете использовать его в этой форме:

#ifdef _OPENMP
    #include <omp.h>     // This line won't add the library if you don't compile with -fopenmp option.
    #ifdef _MSC_VER
         // For Microsoft compiler
         #define OMP_FOR(n) __pragma(omp parallel for if(n>10)) 
    #else  // assuming "__GNUC__" is defined
         // For GCC compiler
         #define OMP_FOR(n) _Pragma("omp parallel for if(n>10)")
    #endif
#else
    #define omp_get_thread_num() 0
    #define OMP_FOR(n)
#endif

Теперь вы можете использовать OMP_FOR(n) так:

int main() {
    int n=11;

    OMP_FOR(n)
    for(int i=0; i<4; i++)
        printf("Thread %d\n",omp_get_thread_num());
}

Вы должны скомпилировать код с помощью следующей команды:

cl /fopenmp file.c

или, если вы используете GCC,

gcc -fopenmp file.c -o exe

Выход для n>10:

Thread 2
Thread 0
Thread 1
Thread 3

Выход для n<10:

Thread 0
Thread 0
Thread 0
Thread 0
...