Preprocessor macros allow a user to write portable code in the face of non-portable features by enabling platform-specific code only when it is supported.
See Pre-defined C/C++ Compiler Macros for an incredibly thorough list of preprocessor macros for various compilers, systems, etc.
With GCC, you can get the predefined macros using gcc -dM -E - < /dev/null.
Language | Macro | Details |
---|---|---|
C89 | __STDC__ |
ANSI X3.159-1989 |
C90 | __STDC_VERSION__ |
ISO/IEC 9899:1990 |
C94 | __STDC_VERSION__ = 199409L |
ISO/IEC 9899-1:1994 |
C99 | __STDC_VERSION__ = 199901L |
ISO/IEC 9899:1999 |
C11 | __STDC_VERSION__ = 201112L |
ISO/IEC 9899:2011 |
C20 | __STDC_VERSION__ > 201710L |
|
C++ | __cplusplus |
|
C++98 | __cplusplus = 199711L |
ISO/IEC 14882:1998 |
C++11 | __cplusplus = 201103L |
ISO/IEC 14882:2011 |
C++14 | __cplusplus = 201402L |
ISO/IEC 14882:2014 |
C++17 | __cplusplus = 201703L |
ISO/IEC 14882:2017 |
C++20 | __cplusplus > 201703L |
See https://en.cppreference.com/w/cpp/feature_test for fine-grain feature testing in C++.
Language | Macro | Details |
---|---|---|
UPC | __UPC__ |
UPC Identification |
UPC | __UPC_DYNAMIC_THREADS__ |
The integer constant 1 in the dynamic THREADS translation environment. |
UPC | __UPC_STATIC_THREADS__ |
The integer constant 1 in the static THREADS translation environment. |
OpenMP | _OPENMP |
OpenMP |
OpenMP | _OPENMP = 200505 |
OpenMP 2.5 |
OpenMP | _OPENMP = 200805 |
OpenMP 3.0 |
OpenMP | _OPENMP = 201107 |
OpenMP 3.1 |
OpenMP | _OPENMP = 201307 |
OpenMP 4.0 |
OpenMP | _OPENMP = 201511 |
OpenMP 4.5 |
OpenMP | _OPENMP = 201811 |
OpenMP 5.0 |
Cilk | __cilk = 200 |
Cilk++ |
Macro | Purpose |
---|---|
__GNUC__ |
Identification |
__GNUC__ |
Version |
__GNUC_MINOR__ |
Revision |
__GNUC_PATCHLEVEL__ |
Patch (introduced in version 3.0) |
Macro | Purpose |
---|---|
__llvm__ |
Identification of LLVM |
__clang__ |
Identification of Clang |
__clang_major__ |
Clang Version |
__clang_minor__ |
Clang Revision |
__clang_patchlevel__ |
Clang Patch |
Macro | Purpose |
---|---|
__INTEL_COMPILER |
Identification |
__INTEL_COMPILER |
Version (Format: VRP, where V = Version, R = Revision, P = Patch) |
__INTEL_OFFLOAD |
True if Intel compiler supports offload (on by default) |
Macro | Purpose |
---|---|
_CRAYC |
Identification |
_RELEASE |
Version |
_RELEASE_MINOR |
Revision |
Macro | Purpose |
---|---|
__xlc__ |
Identification |
__xlC__ |
Identification |
__IBMC__ |
Identification |
__IBMCPP__ |
Identification |
__IBMC__ |
Version (Format: VRP, where V = Version, R = Revision, P = Patch) |
__IBMCPP__ |
Version (Format: VRP, where V = Version, R = Revision, P = Patch) |
Use nvc++ -stdpar -cuda -acc -mp -target=multicore -dM -E /dev/null | grep NV
to find more...
Macro | Purpose |
---|---|
__NVCOMPILER |
Identification |
__NVCOMPILER_MAJOR__ |
Version |
__NVCOMPILER_MINOR__ |
Revision |
__NVCOMPILER_PATCHLEVEL__ |
Patch |
__NVCOMPILER_CUDA__ , _NVHPC_CUDA |
CUDA support enabled |
_NVHPC_STDPAR_GPU , _NVHPC_STDPAR_CUDA |
StdPar for GPU with CUDA (i.e. -stdpar=gpu ) |
_NVHPC_STDPAR_MULTICORE , _NVHPC_STDPAR_OMP |
StdPar for CPU with OpenMP (i.e. -stdpar=multicore ) |
__NVCOMPILER_CUDA_ARCH__ |
CUDA arch (e.g. 860 for sm_86 ) |
Note that the following PGI macros are also supported, for historical reasons.
Macro | Purpose |
---|---|
__PGI |
Identification |
__PGIC__ |
Version |
__PGIC_MINOR__ |
Revision |
__PGIC_PATCHLEVEL__ |
Patch |
Macro | Purpose |
---|---|
MPI_VERSION |
Version |
MPI_SUBVERSION |
Revision |
MPICH |
Identification of MPICH |
MPICH_NUMVERSION |
MPICH Version for numerical comparison (See mpi.h for details) |
MPICH_VERSION |
MPICH Version as string |
OPEN_MPI |
Identification of OpenMPI |
OMPI_MAJOR_VERSION |
OpenMPI Version |
OMPI_MINOR_VERSION |
OpenMPI Revision |
OMPI_RELEASE_VERSION |
OpenMPI Patch Level |
Macro | Purpose |
---|---|
__CUDACC__ |
Identification |
__CUDACC_VER__ |
Toolkit Version - added in CUDA 7.5, removed in CUDA 8.0 (Format: XXYYZZ, where XX = Major Version Number, YY = Minor Version Number, ZZ = Build Number) |
__CUDACC_VER_MAJOR__ |
Toolkit Major Version - added in CUDA 7.5 |
__CUDACC_VER_MINOR__ |
Toolkit Minor Version - added in CUDA 7.5 |
__CUDACC_VER_BUILD__ |
Toolkit Build Version - added in CUDA 7.5 |
CUDA_VERSION |
API Version - defined in <cuda.h> (Format: XXYY, where XX = Major Version Number, YY = Minor Version Number) |
Some of these were obtained from the site linked above and are assumed to be correct.
OS | Macro | Details |
---|---|---|
Linux | __linux__ |
|
Mac OSX | __APPLE__ |
This may not be the best way to do this since this macro may be defined in other operating systems produced by Apple. |
Mac OSX | __MACH__ |
Distinguishes Darwin/Mach kernel from iOS. |
BSD | __FreeBSD__ , __NetBSD__ , __OpenBSD__ , __bsdi__ , __DragonFly__ |
Unverified. |
AIX | _AIX |
Unverified due to lack of system access. |
Blue Gene CNK | __bg__ |
See below for details. |
TODO: Test for POSIX support?
Manually extracted from Cray compilers (i.e. verified):
Macro | Meaning |
---|---|
__CRAYXT |
Defined on the Cray XT architecture. |
__CRAYXE |
Defined on the Cray XE architecture. |
__CRAYXC |
Defined on the Cray XC architecture. |
__CRAYXT_COMPUTE_LINUX_TARGET |
Defined when Cray is using Linux, as opposed to Catamount. |
From Cray documentation (i.e. reputable):
Macro | Meaning |
---|---|
__CRAY |
Defined as 1 on UNICOS/mp systems. |
_CRAYIEEE |
Defined as 1 if the targeted CPU type uses IEEE floating-point format. |
From IBM Blue Gene/P compiler documentation and IBM Blue Gene/Q compiler documentation (i.e. reliable):
Macro | Meaning |
---|---|
__bg__ |
Indicates that this is a Blue Gene platform. |
__blrts , __blrts__ |
Indicates that the target architecture is Blue Gene/L. |
__bgp__ |
Indicates that the architecture is Blue Gene/P. |
__bgq__ |
Indicates that the architecture is Blue Gene/Q. |
__TOS_BLRTS__ |
Indicates that the target architecture is Blue Gene/L. |
__TOS_BGP__ |
Indicates that the target architecture is Blue Gene/P. |
__TOS_BGQ__ |
Indicates that the target architecture is Blue Gene/Q. |
__VECTOR4DOUBLE__ |
Indicates the support of vector data types on Blue Gene/Q. |
The __bg__
, __bgp__
, and __bgq__
have been verified on both Blue Gene/P and Blue Gene/Q systems and are the recommended one in this authors opinion.
Suffix | Macro | Description |
---|---|---|
SSE | __SSE__ |
Introduced with Pentium 3. |
SSE2 | __SSE2__ |
Introduced with Willamette (Pentium 4). |
SSE3 | __SSE3__ |
Introduced with Prescott. |
SSE4.1 | __SSE4_1__ |
Introduced with Penryn. |
SSE4.2 | __SSE4_2__ |
Introduced with Penryn. |
SSSE3 | __SSSE3__ |
Introduced with Merom. |
AVX | __AVX__ |
Introduced with Sandy Bridge. |
AVX2 | __AVX2__ |
Introduced with Haswell. |
FMA | __FMA__ |
Fused-multiple-add instructions. |
FMA4 | __FMA4__ |
See https://en.wikipedia.org/wiki/FMA_instruction_set. |
Suffix | Macro | Description |
---|---|---|
F | __AVX512F__ |
Foundation |
CD | __AVX512CD__ |
Conflict Detection Instructions (CDI) |
ER | __AVX512ER__ |
Exponential and Reciprocal Instructions (ERI) |
PF | __AVX512PF__ |
Prefetch Instructions (PFI) |
DQ | __AVX512DQ__ |
Doubleword and Quadword Instructions (DQ) |
BW | __AVX512BW__ |
Byte and Word Instructions (BW) |
VL | __AVX512VL__ |
Vector Length Extensions (VL) |
IFMA | __AVX512IFMA__ |
Integer Fused Multiply Add (IFMA) |
VBMI | __AVX512VBMI__ |
Vector Byte Manipulation Instructions (VBMI) |
VBMI2 | __AVX512VBMI2__ |
Vector Byte Manipulation Instructions 2 (VBMI2) |
BITALG | __AVX512BITALG__ |
Vector Bit Algorithms |
VNNI | __AVX512VNNI__ |
Vector Neural Network Instructions |
VNNIW | __AVX5124VNNIW__ |
Vector instructions for deep learning enhanced word variable precision |
FMAPS | __AVX5124FMAPS__ |
Vector instructions for deep learning floating-point single precision |
VPOPCNT | __AVX512VPOPCNTDQ__ |
Vectorized Hamming weight |
VP2INTERSECT | __AVX512VP2INTERSECT__ |
Compute intersection between doublewords/quadwords to a pair of mask registers |
The primary source for these is the Intel® Architecture Instruction Set Extensions Programming Reference.
The intrinsics for AVX-512 are nicely documented in the Intel Intrinsics Guide.
Wikipedia's articles AVX-512 is a useful unofficial source.
LLVM source code (http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Preprocessor/predefined-arch-macros.c?view=diff&r1=262200&r2=262201&pathrev=262201) is the basis for two of the entries in the above table.
Cauldron14_AVX-512_Vector_ISA_Kirill_Yukhin_20140711.pdf and Intel® AVX-512 Instructions and Their Use in the Implementation of Math Functions may be of interest.