2009-08-19 5 views
24

У меня есть программа на C++ с использованием OpenMP, которая будет работать на нескольких машинах, которые могут иметь или не иметь установленный OpenMP.Игнорировать OpenMP на машине, у которой ее нет

Как я мог бы сделать свою программу знать, если машина не имеет OpenMP и игнорировать эти #include <omp.h>, OpenMP директивы (как #pragma omp parallel ...) и/или библиотечных функций (как tid = omp_get_thread_num();)?

+1

См. Ответ Эндрю. Лучшее, что я могу сказать, он единственный, кто действительно ответил на вопрос (и сделал это правильно). Также см. [Что предопределяет препроцессор? -fopenmp обеспечить?] (Http://stackoverflow.com/q/30803126) – jww

ответ

1

OpenMP - это среда выполнения компилятора, а не платформа.

ie. Если вы скомпилируете свое приложение с помощью Visual Studio 2005 или выше, у вас всегда есть OpenMP, доступный по мере его поддержки. (и если у конечного пользователя не установлена ​​среда исполнения Visual Studio C, ваше приложение не будет работать вообще).

Итак, вам не нужно беспокоиться, если вы можете использовать его, он всегда будет там, как функции, такие как strcmp. Чтобы убедиться, что у них есть CRT, вы можете установить визуальную студию, распространяемую.

редактировать:

нормально, но GCC 4.1 не сможет компилировать OpenMP приложения, так что вопрос не является целевой машине, но целевой компилятор. Поскольку у всех компиляторов есть предопределенные макросы, дающие их версию, оберните ваши вызовы OpenMP блоками #ifdef. например, GCC использует 3 макроса для идентификации версии компилятора, __GNUC__, __GNUC_MINOR__ and __GNUC_PATCHLEVEL__

+0

Моя проблема заключается в том, что я хочу запустить программу без многопоточности на тех машинах, которые ее не имеют. GCC ниже версии 4.2.x не поддерживает OpenMP. Поэтому я хочу, чтобы мой Makefile мог это рассказать и попросил g ++ игнорировать часть OpenMP в моей программе, а не компиляцию. Есть идеи? – Tim

+3

-1: Версия компилятора полностью неадекватна. Как компилятор, так и среда выполнения должны поддерживать openmp _and_, он также должен быть _enabled_. Одна и та же версия компилятора может поддерживать openmp на одном компьютере и не поддерживать его на другом. –

19

Компиляторы должны игнорировать #pragma директивы, которые они не понимают; в этом весь смысл синтаксиса. И функции, определенные в openmp.h, имеют простые четко определенные значения в непараллельной системе - в частности, файл заголовка проверяет, определяет ли компилятор ENABLE_OPENMP и, если он не включен, предоставляет правильные резервные копии.

Итак, все, что вам нужно, это копия openmp.h для ссылки. Вот один из них: http://cms.mcc.uiuc.edu/qmcdev/docs/html/OpenMP_8h-source.html.

Соответствующая часть кода, однако, именно это:

#if defined(ENABLE_OPENMP) 
#include <omp.h> 
#else 
typedef int omp_int_t; 
inline omp_int_t omp_get_thread_num() { return 0;} 
inline omp_int_t omp_get_max_threads() { return 1;} 
#endif 

В худшем случае, вы можете просто взять эти три строки и поместить их в фиктивной openmp.h файл и использовать. Остальное будет работать.

+11

+1 для семантики '# прагма'. -1 для 'ENABLE_OPENMP', который не является стандартным. Вместо этого используйте '_OPENMP'. – YvesgereY

+0

* "... файл заголовка проверяет, определяет ли компилятор ENABLE_OPENMP" * - Я не думаю, что это правда.Не могли бы вы предоставить ссылку для 'ENABLE_OPENMP'? Я не мог найти его в определении препроцессора. См. [Какой параметр препроцессора задает -fopenmp?] (Http://stackoverflow.com/q/30803126) – jww

+0

Я компилирую с clang 3.6.2 и 'clang ++ -fopenmp' сообщает мне, что _OPENMP не определен. – Arne

48

OpenMP компиляции добавляет определение препроцессора «_OPENMP», так что вы можете сделать:

#if defined(_OPENMP) 
    #pragma omp ... 
#endif 

Для некоторых примеров, см http://bisqwit.iki.fi/story/howto/openmp/#Discussion и код, который следует.

+5

Нет необходимости защищать #pragma omp, поскольку такая прагма не навязчива (безопасно пропускается, когда openmd не активируется). – YvesgereY

+9

Хотя верно, если кто-то любит компилировать без предупреждений даже под -Wall, тогда сообщение компилятора, такое как предупреждение: unknown pragma ignored, будет раздражать. –

+2

О компиляционном предупреждении, я использую для компиляции с '-Wno-unknown-pragmas' именно по этой причине. Проблема: может повлиять на другие прагмы в проекте и удалить полезные предупреждения. –

Смежные вопросы