Проигнорируйте OpenMP на машине, которая не имеет его

Зависьте от своей ситуации, Вы смогли избегать использования блокировок путем усиления Системы. Поточная обработка. Взаимно блокируемый тот же код в примере Jon становится:

System.Threading.Interlocked.Exchange(valueType,0)
29
задан nbro 6 November 2017 в 13:21
поделиться

2 ответа

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

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

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

edit:

Хорошо, но GCC 4.1 не сможет скомпилировать ваше приложение openMP, поэтому проблема не в целевой машине, а в целевой компилятор. Поскольку все компиляторы имеют предопределенные макросы, указывающие их версию, заключите вызовы OpenMP в блоки #ifdef. например, GCC использует 3 макроса для определения версии компилятора, __ GNUC__, __GNUC_MINOR__ и __GNUC_PATCHLEVEL __

2
ответ дан 28 November 2019 в 00:52
поделиться

Предполагается, что компиляторы игнорируют директивы #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 и использовать его. Остальное просто подойдет.

21
ответ дан 28 November 2019 в 00:52
поделиться