2015-06-12 6 views
3

У меня есть код, который может работать с (или без) 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-файл.

+0

Что случилось с '#if OMP_H'? – mtijanic

+2

Просто подумайте (я не использую OpenMP): Почему бы просто не использовать '-D WITH_OPENMP' (или подобное) при вызове gcc? – Olaf

+0

Да, просто прочитайте ответ. Как я писал: «просто быстрая мысль». Кроме того: вы код C++, а не C (неправильный тег) – Olaf

ответ

5

Ваш grep был слишком специфичным, вы должны были искать «openmp».

Или, скорее, сравнивает cpp -dM -fopenmp </dev/null и cpp -dM </dev/null производит один диф:

#define _OPENMP 201107 

Какие должно быть именно то, что вы ищете.

+0

Большое спасибо. И хорошая идея о различии. Он бьет, принимая удары в темноте, потому что вы не можете найти его в документации. В этом случае он выглядит недокументированным: 0 просмотров для '$ man -k" _OPENMP "'. – jww

+1

@jww Я нашел несколько упоминаний об этом в Интернете, включая некоторые документы GCC. Я советую сначала проверить, могут ли другие компиляторы, которые могут потребоваться для поддержки (например, msvc), также определить его, прежде чем приступать к его использованию. – mtijanic

+1

@jww gcc, msvc и clang все определяют его, фактически. Тебе должно быть хорошо. – mtijanic

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