Как легко отключить директивы OpenMP?

У меня есть код С++ с открытыми прагматиками OpenMP. Я хочу протестировать этот код как для многопоточного режима (с OpenMP), так и в режиме одиночного потока (без OpenMP).

Теперь, чтобы переключиться между режимами, мне нужно прокомментировать #pragma omp (или по крайней мере parallel).

Каков самый чистый или по умолчанию способ включения/отключения OpenMP?

Ответы

Ответ 1

Изучите руководство для компилятора для коммутатора, который отключает OpenMP. Для GCC OpenMP отключен по умолчанию и включен с параметром -fopenmp.

Другим вариантом будет запуск кода с переменной окружения OMP_NUM_THREADS, установленной в 1, хотя это не совсем то же самое, что компиляция без OpenMP в первую очередь.

Ответ 2

Если вы не компилируете с опцией -fopenmp, вы не получите параллельный код. Вы можете сделать это с помощью подходящего define и makefile, который генерирует все коды.

В документации OpenMP (только пример):

#ifdef _OPENMP
   #include <omp.h>
#else
   #define omp_get_thread_num() 0
#endif

См. http://www.openmp.org/mp-documents/spec30.pdf (условная компиляция).

Ответ 3

Как обычно обрабатываются такие вещи (общий случай) с #define и #ifdef:

В вашем файле заголовка:

#ifndef SINGLETHREADED
#pragma omp
#endif

При компиляции добавьте -DSINGLETHREADED, чтобы отключить OpenMP:

cc  -DSINGLETHREADED <other flags go here> code.c