ls1-MarDyn
ls1-MarDyn molecular dynamics code
SIMD_TYPES.h
Go to the documentation of this file.
1/***********************************************************************************/
10#pragma once
11#ifndef SIMD_TYPES_H
12#define SIMD_TYPES_H
13
14#include <type_traits>
15#include <cstdint>
16
17// definitions for precision:
18#if defined(VCP_SPSP) or \
19 defined(VCP_SPDP) or \
20 defined(VCP_DPDP)
21 #error conflicting precision definitions
22#endif
23
24#define VCP_SPSP 0
25#define VCP_SPDP 1
26#define VCP_DPDP 2
27
28#if defined(MARDYN_SPSP)
29 #define VCP_PREC VCP_SPSP
30#elif defined(MARDYN_SPDP)
31 #define VCP_PREC VCP_SPDP
32#elif defined(MARDYN_DPDP)
33 #define VCP_PREC VCP_DPDP
34#else
35 #error Precision macro not defined.
36#endif
37
38// The following error should NEVER occur, since it signalizes, that the macros, used by THIS translation unit are defined anywhere else in the program.
39#if defined(VCP_VEC_TYPE) || defined(VCP_NOVEC) || defined(VCP_VEC_SSE3) || defined(VCP_VEC_AVX) || defined(VCP_VEC_AVX2) || \
40 defined(VCP_VEC_KNL) || defined(VCP_VEC_KNL_GATHER)
41 #error conflicting macro definitions
42#endif
43
44
45#define VCP_NOVEC 0
46#define VCP_VEC_SSE3 1
47#define VCP_VEC_AVX 2
48#define VCP_VEC_AVX2 3
49#define VCP_VEC_KNL 6
50#define VCP_VEC_KNL_GATHER 7
51#define VCP_VEC_AVX512F 8
52#define VCP_VEC_AVX512F_GATHER 9
53
54#define VCP_VEC_W__64 0
55#define VCP_VEC_W_128 1
56#define VCP_VEC_W_256 2
57#define VCP_VEC_W_512 3
58
59#if defined(__AVX2__) && not defined(__FMA__)//fma should always be existent alongside avx2!!!
60 #warn AVX2 enabled, but no FMA found. Please enable fma to use avx2.
61#endif
62
63// define symbols for vectorization
64#if defined(__AVX512F__) && defined(__AVX512ER__)
65 #if defined(__VCP_GATHER__)
66 #define VCP_VEC_TYPE VCP_VEC_KNL_GATHER
67 #else
68 #define VCP_VEC_TYPE VCP_VEC_KNL
69 #endif
70#elif defined(__AVX512F__)
71 #if defined(__VCP_GATHER__)
72 #define VCP_VEC_TYPE VCP_VEC_AVX512F_GATHER
73 #else
74 #define VCP_VEC_TYPE VCP_VEC_AVX512F
75 #endif
76#elif defined(__AVX2__) && defined(__FMA__)
77 #define VCP_VEC_TYPE VCP_VEC_AVX2
78#elif defined(__AVX__) && not defined(AVX128)
79 #define VCP_VEC_TYPE VCP_VEC_AVX
80#elif defined(__AVX__) && defined(AVX128)
81 #define VCP_VEC_TYPE VCP_VEC_SSE3
82#elif defined(__SSE3__)
83 #define VCP_VEC_TYPE VCP_VEC_SSE3
84#else
85 #define VCP_VEC_TYPE VCP_NOVEC
86#endif
87
88#ifdef NOVEC
89 #ifdef VCP_VEC_TYPE
90 #warn Multiple vectorization methods specified. Will not use vectorization at all!
91 #undef VCP_VEC_TYPE
92 #endif
93 #define VCP_VEC_TYPE VCP_NOVEC
94#endif
95
96// Include necessary files if we vectorize.
97#if VCP_VEC_TYPE==VCP_NOVEC
98 // no file to include
99#elif VCP_VEC_TYPE==VCP_VEC_SSE3
100 #include "pmmintrin.h"
101#else
102 // all others need immintrin.h
103 #include "immintrin.h"
104#endif
105
106// define necessary types
107
111
112typedef int countertype32;//int is 4Byte almost everywhere... replace with __int32 if problems occur
113
114#if VCP_VEC_TYPE==VCP_NOVEC //novec comes first. For NOVEC no specific types are specified -- use build in ones.
115
116 #define VCP_VEC_WIDTH VCP_VEC_W__64
117
118 typedef uint8_t vcp_mask_vec;
119 typedef uint8_t vcp_mask_single;
120 typedef vcp_mask_vec vcp_lookupOrMask_vec;
121 typedef vcp_mask_single vcp_lookupOrMask_single;
122
123#elif VCP_VEC_TYPE==VCP_VEC_SSE3 //sse3
124
125 #define VCP_VEC_WIDTH VCP_VEC_W_128
126
128
129 typedef __m128i vcp_mask_vec;
130 typedef vcp_mask_vec vcp_lookupOrMask_vec;
131 typedef vcp_mask_single vcp_lookupOrMask_single;
132
133#elif VCP_VEC_TYPE==VCP_VEC_AVX or VCP_VEC_TYPE==VCP_VEC_AVX2//avx, avx2
134
135 #define VCP_VEC_WIDTH VCP_VEC_W_256
136
138
139 typedef __m256i vcp_mask_vec;
140 typedef vcp_mask_vec vcp_lookupOrMask_vec;
141 typedef vcp_mask_single vcp_lookupOrMask_single;
142
143#elif VCP_VEC_TYPE==VCP_VEC_KNL or \
144 VCP_VEC_TYPE==VCP_VEC_KNL_GATHER or \
145 VCP_VEC_TYPE==VCP_VEC_AVX512F or \
146 VCP_VEC_TYPE==VCP_VEC_AVX512F_GATHER
147
148 #define VCP_VEC_WIDTH VCP_VEC_W_512
149
150 // these can't be put in std::conditional, because it would just be too nice. warnings.
151 #if VCP_PREC==VCP_SPSP or VCP_PREC==VCP_SPDP
152 typedef __mmask16 vcp_mask_vec;
153 typedef __mmask16 vcp_mask_single;
154 #else // VCP_PREC==VCP_DPDP
155 typedef __mmask8 vcp_mask_vec;
156 typedef __mmask8 vcp_mask_single;
157 #endif
158
159 #if VCP_VEC_TYPE==VCP_VEC_KNL or VCP_VEC_TYPE==VCP_VEC_AVX512F
160 typedef vcp_mask_vec vcp_lookupOrMask_vec;
161 typedef vcp_mask_single vcp_lookupOrMask_single;
162
163 #else // VCP_VEC_TYPE==VCP_VEC_KNL_GATHER or VCP_VEC_AVX512F_GATHER
164 typedef __m512i vcp_lookupOrMask_vec;
165 typedef countertype32 vcp_lookupOrMask_single;
166 #endif
167
168#endif
169
170/*
171 * Control macros are set
172 *
173 * Include the function macros
174 */
175#pragma GCC diagnostic push
176#pragma GCC diagnostic ignored "-Wunused-variable"
177#include "SIMD_DEFINITIONS.h"
178
179#endif /* SIMD_TYPES_H */
Contains macro definitions for the intrinsics used for the vectorization.
typedef::xsd::cxx::tree::type type
C++ type corresponding to the anyType XML Schema built-in type.
Definition: vtk-punstructured.h:119