Как я могу сделать так, чтобы моя программа знала, если на машине нет OpenMP, и игнорирую эти #include <omp.h>
, директивы OpenMP (например, #pragma omp parallel ...
) и / или библиотечные функции (например, tid = omp_get_thread_num();
)?
Вот поздний ответ, но мы только что получили сообщение об ошибке из-за использования #pragma omp simd
в компиляторах Microsoft.
Согласно Спецификация OpenMP , раздел 2.2:
Условная компиляция
В реализациях, которые поддерживают препроцессор, имя макроса _OPENMP
определяется как десятичное значение yyyymm, где yyyy и mm являются
год и четвертое обозначения версии OpenMP API, которую
Поддержка реализации.
Похоже, что современные компиляторы Microsoft поддерживают OpenMP только в период между 2000 и 2005 годами. Я могу сказать только "иногда", потому что OpenMP 2.0 был выпущен в 2000 году, а OpenMP 2.5 был выпущен в 2005 году. Но Microsoft рекламирует версию с 2002 года.
Вот несколько _OPENMP
чисел ...
- Visual Studio 2012 - OpenMP 200203
- Visual Studio 2017 - OpenMP 200203
- IBM XLC 13.01 - OpenMP 201107
- Clang 7.0 - OpenMP 201107
- GCC 4.8 - OpenMP 201107
- GCC 8.2 - OpenMP 201511
Итак, если вы хотите использовать, скажем, #pragma omp simd
для защиты цикла, и #pragma omp simd
доступно в OpenMP 4.0, тогда:
#if _OPENMP >= 201307
#pragma omp simd
for (size_t i = 0; i < 16; ++i)
data[i] += x[i];
#else
for (size_t i = 0; i < 16; ++i)
data[i] += x[i];
#endif
, который будет работать на нескольких машинах, на которых может быть установлен или не установлен OpenMP.
И чтобы быть ясным, вам, вероятно, нужно собрать свою программу на каждой из этих машин. ABI x86_64 не гарантирует, что OpenMP доступен на машинах x86, x32 или x86_64. И я не читал, вы можете собрать на одной машине, а затем запустить на другой машине.