Как легко отключить директивы 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