У меня есть код, который может работать с (или без) OpenMP - это зависит от того, как пользователь устанавливает make-файл. Если они хотят работать с OpenMP, то они просто добавляют -fopenmp
в CFLAGS
и CXXFLAGS
.Какой препроцессор определяет, предоставляет ли -fopenmp?
Я пытаюсь определить, какой макрос препроцессора я могу использовать, чтобы указать, когда действует -fopenmp
. Заголовок omp.h
не выглядит очень интересно:
$ cat /usr/lib/gcc/x86_64-linux-gnu/4.8/include/omp.h | grep define
#define OMP_H 1
#define _LIBGOMP_OMP_LOCK_DEFINED 1
# define __GOMP_NOTHROW throw()
# define __GOMP_NOTHROW __attribute__((__nothrow__))
И я не могу получить препроцессор предложить что-нибудь полезное:
$ cpp -dM -fopenmp </dev/null | grep -i omp
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 1
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 1
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 1
#define __STDC_IEC_559_COMPLEX__ 1
$ cpp -dM -fopenmp </dev/null | grep -i version
#define __GXX_ABI_VERSION 1002
#define __VERSION__ "4.8.2"
Что препроцессор определяют ли -fopenmp
предоставить?
Проблема, которую я пытаюсь решить просто войти:
#if defined(<some define>)
cout << "Compiled and linked with OpenMP" << endl;
#endif
И мне нужно знать, определить просто #include <omp.h>
, потому что его до пользователю либо добавить (или опустить) -fopenmp
.
Это похоже на How to tell if OpenMP is working? Но я заинтересован во время компиляции, а не после сборки или выполнения.
Примечание: этот проект не использует Boost, не использует Autotools и не использует CMake. Он просто использует make-файл.
Что случилось с '#if OMP_H'? – mtijanic
Просто подумайте (я не использую OpenMP): Почему бы просто не использовать '-D WITH_OPENMP' (или подобное) при вызове gcc? – Olaf
Да, просто прочитайте ответ. Как я писал: «просто быстрая мысль». Кроме того: вы код C++, а не C (неправильный тег) – Olaf