Отключить OpenMP - PullRequest
       29

Отключить OpenMP

3 голосов
/ 31 августа 2009

В моей программе на C ++ я хотел бы иногда запускать ее исполняемый файл с использованием, а иногда и без использования OpenMP (то есть многопоточность или однопоточность). Я рассматриваю любой из следующих двух случаев, когда мой код использует OpenMP:

(1) Предположим, что мой код содержит только директивы #include <omp.h> и OpenMP.

(2) То же, что (1), и мой код далее вызывает функции OpenMP, такие как omp_get_thread_num().

Чтобы не иметь разный код для разных работ, это единственный способ использовать некоторую переменную, определяемую самим прекомпилятором, для защиты от появления OpenMP в моем коде?

Спасибо и всего наилучшего!

Ответы [ 4 ]

10 голосов
/ 02 сентября 2009

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

set OMP_NUM_THREADS=1

На самом деле, он не отключит OpenMP. Это заставит OpenMP создать только один поток для приложения. Работает без перекомпиляции. Я использую эту переменную для проверки масштабируемости в потоках 1, 2, 3, 4 и т. Д.

3 голосов
/ 04 марта 2010

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

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

Теперь, если вы запустите вашу программу без флага -fopenmp, она будет игнорировать директивы openmp

3 голосов
/ 31 августа 2009

Привет, самый простой способ сделать это

omp_set_num_threads(m_iUseableProcessors);

где m_iUseableProcessors - количество процессоров, на которое вы хотите разделить вычисления. Я не знаю, как это сделать без функций OpenMP. Вы могли бы #ifdef их исключить, но это заставит вас отключить OpenMP во время компиляции.

0 голосов
/ 07 апреля 2015

В дополнение к предложению _OPENMP может оказаться полезным использовать _Pragma C99 (или __pragma, если вы используете некоторые компиляторы C ++ - см. этот вопрос StackOverflow для получения подробной информации) чтобы предотвратить засорение вашего кода #ifdef _OPENMP и #endif, тем самым сократив количество строк, связанных с условной компиляцией, в 3 раза и в противном случае предоставив вам O (1) контроль над O (n) экземплярами аннотаций OpenMP.

Например, я использую следующий стиль в моих кодах C99 OpenMP. Изменения для поддержки C ++ должны быть довольно скромными, хотя, возможно, специфичными для компилятора (в этом случае могут быть полезны такие макросы, как __GNUC__, __clang__, __INTEL_COMPILER и т. Д.).

#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
...