vSMC
vSMC: Scalable Monte Carlo
intel.hpp
Go to the documentation of this file.
1 //============================================================================
2 // vSMC/include/vsmc/internal/compiler/intel.hpp
3 //----------------------------------------------------------------------------
4 // vSMC: Scalable Monte Carlo
5 //----------------------------------------------------------------------------
6 // Copyright (c) 2013,2014, Yan Zhou
7 // All rights reserved.
8 //
9 // Redistribution and use in source and binary forms, with or without
10 // modification, are permitted provided that the following conditions are met:
11 //
12 // Redistributions of source code must retain the above copyright notice,
13 // this list of conditions and the following disclaimer.
14 //
15 // Redistributions in binary form must reproduce the above copyright notice,
16 // this list of conditions and the following disclaimer in the documentation
17 // and/or other materials provided with the distribution.
18 //
19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS
20 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
23 // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 // POSSIBILITY OF SUCH DAMAGE.
30 //============================================================================
31 
32 #ifndef VSMC_INTERNAL_COMPILER_INTEL_HPP
33 #define VSMC_INTERNAL_COMPILER_INTEL_HPP
34 
35 #define VSMC_INTEL_NONEXIST 0xFFFFFFFFUL
36 
37 #define VSMC_INTEL_VERSION __INTEL_COMPILER
38 
39 #define VSMC_LIBCPP_NONEXIST 0xFFFFFFFFUL
40 
41 #if defined(_LIBCPP_VERSION) && defined(VSMC_MACOSX)
42 #define VSMC_LIBCPP_VERSION _LIBCPP_VERSION
43 #else
44 #define VSMC_LIBCPP_VERSION 0
45 #endif
46 
47 #define VSMC_LIBSTDCPP_NONEXIST 0xFFFFFFFFUL
48 
49 #if defined(__GLIBCXX__) && defined(__GNUC__) && defined(__linux__)
50 #define VSMC_LIBSTDCPP_VERSION \
51  (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
52 #else
53 #define VSMC_LIBSTDCPP_VERSION 0
54 #endif
55 
56 #if VSMC_INTEL_VERSION >= 1100
57 #ifndef VSMC_HAS_CXX11_LONG_LONG
58 #define VSMC_HAS_CXX11_LONG_LONG 1
59 #endif
60 #endif
61 
62 #if __cplusplus >= 201103L
63 
64 // C++11 language features
65 
66 #if VSMC_INTEL_VERSION >= 1210
67 #ifndef VSMC_HAS_CXX11_ACCESS_CONTROL_SFINAE
68 #define VSMC_HAS_CXX11_ACCESS_CONTROL_SFINAE 1
69 #endif
70 #endif
71 
72 #if VSMC_INTEL_VERSION >= 1210
73 #ifndef VSMC_HAS_CXX11_ALIAS_TEMPLATES
74 #define VSMC_HAS_CXX11_ALIAS_TEMPLATES 1
75 #endif
76 #endif
77 
78 #if VSMC_INTEL_VERSION >= 1500
79 #ifndef VSMC_HAS_CXX11_ALIGNAS
80 #define VSMC_HAS_CXX11_ALIGNAS 1
81 #endif
82 #endif
83 
84 #if VSMC_INTEL_VERSION >= 1210
85 #ifndef VSMC_HAS_CXX11_ATTRIBUTES
86 #define VSMC_HAS_CXX11_ATTRIBUTES 1
87 #endif
88 #endif
89 
90 #if VSMC_INTEL_VERSION >= 1200
91 #ifndef VSMC_HAS_CXX11_AUTO_TYPE
92 #define VSMC_HAS_CXX11_AUTO_TYPE 1
93 #endif
94 #endif
95 
96 #if VSMC_INTEL_VERSION >= 1400
97 #ifndef VSMC_HAS_CXX11_CONSTEXPR
98 #define VSMC_HAS_CXX11_CONSTEXPR 1
99 #endif
100 #endif
101 
102 #if VSMC_INTEL_VERSION >= 1200
103 #ifndef VSMC_HAS_CXX11_DECLTYPE
104 #define VSMC_HAS_CXX11_DECLTYPE 1
105 #endif
106 #endif
107 
108 #if VSMC_INTEL_VERSION >= 1210
109 #ifndef VSMC_HAS_CXX11_DEFAULT_FUNCTION_TEMPLATE_ARGS
110 #define VSMC_HAS_CXX11_DEFAULT_FUNCTION_TEMPLATE_ARGS 1
111 #endif
112 #endif
113 
114 #if VSMC_INTEL_VERSION >= 1200
115 #ifndef VSMC_HAS_CXX11_DEFAULTED_FUNCTIONS
116 #define VSMC_HAS_CXX11_DEFAULTED_FUNCTIONS 1
117 #endif
118 #endif
119 
120 #if VSMC_INTEL_VERSION >= 1400
121 #ifndef VSMC_HAS_CXX11_DELEGATING_CONSTRUCTORS
122 #define VSMC_HAS_CXX11_DELEGATING_CONSTRUCTORS 1
123 #endif
124 #endif
125 
126 #if VSMC_INTEL_VERSION >= 1200
127 #ifndef VSMC_HAS_CXX11_DELETED_FUNCTIONS
128 #define VSMC_HAS_CXX11_DELETED_FUNCTIONS 1
129 #endif
130 #endif
131 
132 #if VSMC_INTEL_VERSION >= 1300
133 #ifndef VSMC_HAS_CXX11_EXPLICIT_CONVERSIONS
134 #define VSMC_HAS_CXX11_EXPLICIT_CONVERSIONS 1
135 #endif
136 #endif
137 
138 #if VSMC_INTEL_VERSION >= 1400
139 #ifndef VSMC_HAS_CXX11_GENERALIZED_INITIALIZERS
140 #define VSMC_HAS_CXX11_GENERALIZED_INITIALIZERS 1
141 #endif
142 #endif
143 
144 #if VSMC_INTEL_VERSION >= 1400
145 #ifndef VSMC_HAS_CXX11_IMPLICIT_MOVES
146 #define VSMC_HAS_CXX11_IMPLICIT_MOVES 1
147 #endif
148 #endif
149 
150 #if VSMC_INTEL_VERSION >= 1500
151 #ifndef VSMC_HAS_CXX11_INHERITING_CONSTRUCTORS
152 #define VSMC_HAS_CXX11_INHERITING_CONSTRUCTORS 1
153 #endif
154 #endif
155 
156 #if VSMC_INTEL_VERSION >= 1400
157 #ifndef VSMC_HAS_CXX11_INLINE_NAMESPACES
158 #define VSMC_HAS_CXX11_INLINE_NAMESPACES 1
159 #endif
160 #endif
161 
162 #if VSMC_INTEL_VERSION >= 1300
163 #ifndef VSMC_HAS_CXX11_LAMBDAS
164 #define VSMC_HAS_CXX11_LAMBDAS 1
165 #endif
166 #endif
167 
168 #if VSMC_INTEL_VERSION >= 1200
169 #ifndef VSMC_HAS_CXX11_LOCAL_TYPE_TEMPLATE_ARGS
170 #define VSMC_HAS_CXX11_LOCAL_TYPE_TEMPLATE_ARGS 1
171 #endif
172 #endif
173 
174 #if VSMC_INTEL_VERSION >= 1400
175 #ifndef VSMC_HAS_CXX11_NOEXCEPT
176 #define VSMC_HAS_CXX11_NOEXCEPT 1
177 #endif
178 #endif
179 
180 #if VSMC_INTEL_VERSION >= 1400
181 #ifndef VSMC_HAS_CXX11_NONSTATIC_MEMBER_INIT
182 #define VSMC_HAS_CXX11_NONSTATIC_MEMBER_INIT 1
183 #endif
184 #endif
185 
186 #if VSMC_INTEL_VERSION >= 1210
187 #ifndef VSMC_HAS_CXX11_NULLPTR
188 #define VSMC_HAS_CXX11_NULLPTR 1
189 #endif
190 #endif
191 
192 #if VSMC_INTEL_VERSION >= 1400
193 #ifndef VSMC_HAS_CXX11_OVERRIDE_CONTROL
194 #define VSMC_HAS_CXX11_OVERRIDE_CONTROL 1
195 #endif
196 #endif
197 
198 #if VSMC_INTEL_VERSION >= 1300
199 #ifndef VSMC_HAS_CXX11_RANGE_FOR
200 #define VSMC_HAS_CXX11_RANGE_FOR 1
201 #endif
202 #endif
203 
204 #if VSMC_INTEL_VERSION >= 1400
205 #ifndef VSMC_HAS_CXX11_RAW_STRING_LITERALS
206 #define VSMC_HAS_CXX11_RAW_STRING_LITERALS 1
207 #endif
208 #endif
209 
210 #if VSMC_INTEL_VERSION >= 1400
211 #ifndef VSMC_HAS_CXX11_REFERENCE_QUALIFIED_FUNCTIONS
212 #define VSMC_HAS_CXX11_REFERENCE_QUALIFIED_FUNCTIONS 1
213 #endif
214 #endif
215 
216 #if VSMC_INTEL_VERSION >= 1200
217 #ifndef VSMC_HAS_CXX11_RVALUE_REFERENCES
218 #define VSMC_HAS_CXX11_RVALUE_REFERENCES 1
219 #endif
220 #endif
221 
222 #if VSMC_INTEL_VERSION >= 1100
223 #ifndef VSMC_HAS_CXX11_STATIC_ASSERT
224 #define VSMC_HAS_CXX11_STATIC_ASSERT 1
225 #endif
226 #endif
227 
228 #if VSMC_INTEL_VERSION >= 1400
229 #ifndef VSMC_HAS_CXX11_STRONG_ENUMS
230 #define VSMC_HAS_CXX11_STRONG_ENUMS 1
231 #endif
232 #endif
233 
234 #if VSMC_INTEL_VERSION >= 1500
235 #ifndef VSMC_HAS_CXX11_THREAD_LOCAL
236 #define VSMC_HAS_CXX11_THREAD_LOCAL 1
237 #endif
238 #endif
239 
240 #if VSMC_INTEL_VERSION >= 1200
241 #ifndef VSMC_HAS_CXX11_TRAILING_RETURN
242 #define VSMC_HAS_CXX11_TRAILING_RETURN 1
243 #endif
244 #endif
245 
246 #if VSMC_INTEL_VERSION >= 1210
247 #ifndef VSMC_HAS_CXX11_UNICODE_LITERALS
248 #define VSMC_HAS_CXX11_UNICODE_LITERALS 1
249 #endif
250 #endif
251 
252 #ifndef _WIN32
253 #if VSMC_INTEL_VERSION >= 1400
254 #ifndef VSMC_HAS_CXX11_UNRESTRICTED_UNIONS
255 #define VSMC_HAS_CXX11_UNRESTRICTED_UNIONS 1
256 #endif
257 #endif
258 #endif
259 
260 #if VSMC_INTEL_VERSION >= 1500
261 #ifndef VSMC_HAS_CXX11_USER_LITERALS
262 #define VSMC_HAS_CXX11_USER_LITERALS 1
263 #endif
264 #endif
265 
266 #if VSMC_INTEL_VERSION >= 1210
267 #ifndef VSMC_HAS_CXX11_VARIADIC_TEMPLATES
268 #define VSMC_HAS_CXX11_VARIADIC_TEMPLATES 1
269 #endif
270 #endif
271 
272 // C++11 library features
273 
274 #if VSMC_INTEL_VERSION >= 1500
275 #if VSMC_LIBCPP_VERSION >= 1101 || VSMC_LIBSTDCPP_VERSION >= 40900
276 #ifndef VSMC_HAS_CXX11LIB_CHRONO
277 #define VSMC_HAS_CXX11LIB_CHRONO 1
278 #endif
279 #endif
280 #endif
281 
282 #if VSMC_INTEL_VERSION >= 1500
283 #if VSMC_LIBCPP_VERSION >= 1101 || VSMC_LIBSTDCPP_VERSION >= 40900
284 #ifndef VSMC_HAS_CXX11LIB_CMATH
285 #define VSMC_HAS_CXX11LIB_CMATH 1
286 #endif
287 #endif
288 #endif
289 
290 #if VSMC_INTEL_VERSION >= 1500
291 #if VSMC_LIBCPP_VERSION >= 1101 || VSMC_LIBSTDCPP_VERSION >= 40900
292 #ifndef VSMC_HAS_CXX11LIB_FUNCTIONAL
293 #define VSMC_HAS_CXX11LIB_FUNCTIONAL 1
294 #endif
295 #endif
296 #endif
297 
298 #if VSMC_INTEL_VERSION >= 1500
299 #if VSMC_LIBCPP_VERSION >= 1101 || VSMC_LIBSTDCPP_VERSION >= 40900
300 #ifndef VSMC_HAS_CXX11LIB_FUTURE
301 #define VSMC_HAS_CXX11LIB_FUTURE 1
302 #endif
303 #endif
304 #endif
305 
306 #if VSMC_INTEL_VERSION >= 1500
307 #if VSMC_LIBCPP_VERSION >= 1101 || VSMC_LIBSTDCPP_VERSION >= 40900
308 #ifndef VSMC_HAS_CXX11LIB_INITIALIZER_LIST
309 #define VSMC_HAS_CXX11LIB_INITIALIZER_LIST 1
310 #endif
311 #endif
312 #endif
313 
314 #if VSMC_INTEL_VERSION >= 1500
315 #if VSMC_LIBCPP_VERSION >= 1101 || VSMC_LIBSTDCPP_VERSION >= 40900
316 #ifndef VSMC_HAS_CXX11LIB_MUTEX
317 #define VSMC_HAS_CXX11LIB_MUTEX 1
318 #endif
319 #endif
320 #endif
321 
322 #if VSMC_INTEL_VERSION >= 1500
323 #if VSMC_LIBCPP_VERSION >= 1101 || VSMC_LIBSTDCPP_VERSION >= 40900
324 #ifndef VSMC_HAS_CXX11LIB_RANDOM
325 #define VSMC_HAS_CXX11LIB_RANDOM 1
326 #endif
327 #endif
328 #endif
329 
330 #if VSMC_INTEL_VERSION >= 1500
331 #if VSMC_LIBCPP_VERSION >= 1101 || VSMC_LIBSTDCPP_VERSION >= 40900
332 #ifndef VSMC_HAS_CXX11LIB_THREAD
333 #define VSMC_HAS_CXX11LIB_THREAD 1
334 #endif
335 #endif
336 #endif
337 
338 #if VSMC_INTEL_VERSION >= 1500
339 #if VSMC_LIBCPP_VERSION >= 1101 || VSMC_LIBSTDCPP_VERSION >= 40900
340 #ifndef VSMC_HAS_CXX11LIB_TUPLE
341 #define VSMC_HAS_CXX11LIB_TUPLE 1
342 #endif
343 #endif
344 #endif
345 
346 #endif // __cplusplus >= 201103L
347 
348 #if __cplusplus >= 201402L
349 
350 // C++14 language features
351 
352 #if VSMC_INTEL_VERSION >= VSMC_INTEL_NONEXIST
353 #ifndef VSMC_HAS_CXX14_AGGREGATE_NSDMI
354 #define VSMC_HAS_CXX14_AGGREGATE_NSDMI 1
355 #endif
356 #endif
357 
358 #if VSMC_INTEL_VERSION >= 1500
359 #ifndef VSMC_HAS_CXX14_BINARY_LITERALS
360 #define VSMC_HAS_CXX14_BINARY_LITERALS 1
361 #endif
362 #endif
363 
364 #if VSMC_INTEL_VERSION >= VSMC_INTEL_NONEXIST
365 #ifndef VSMC_HAS_CXX14_CONTEXTUAL_CONVERSIONS
366 #define VSMC_HAS_CXX14_CONTEXTUAL_CONVERSIONS 1
367 #endif
368 #endif
369 
370 #if VSMC_INTEL_VERSION >= 1500
371 #ifndef VSMC_HAS_CXX14_DECLTYPE_AUTO
372 #define VSMC_HAS_CXX14_DECLTYPE_AUTO 1
373 #endif
374 #endif
375 
376 #if VSMC_INTEL_VERSION >= VSMC_INTEL_NONEXIST
377 #ifndef VSMC_HAS_CXX14_DIGIT_SEPERATORS
378 #define VSMC_HAS_CXX14_DIGIT_SEPERATORS 1
379 #endif
380 #endif
381 
382 #if VSMC_INTEL_VERSION >= VSMC_INTEL_NONEXIST
383 #ifndef VSMC_HAS_CXX14_GENERIC_LAMBDAS
384 #define VSMC_HAS_CXX14_GENERIC_LAMBDAS 1
385 #endif
386 #endif
387 
388 #if VSMC_INTEL_VERSION >= 1500
389 #ifndef VSMC_HAS_CXX14_INIT_CAPTURES
390 #define VSMC_HAS_CXX14_INIT_CAPTURES 1
391 #endif
392 #endif
393 
394 #if VSMC_INTEL_VERSION >= VSMC_INTEL_NONEXIST
395 #ifndef VSMC_HAS_CXX14_RELAXED_CONSTEXPR
396 #define VSMC_HAS_CXX14_RELAXED_CONSTEXPR 1
397 #endif
398 #endif
399 
400 #if VSMC_INTEL_VERSION >= 1500
401 #ifndef VSMC_HAS_CXX14_RETURN_TYPE_DEDUCTION
402 #define VSMC_HAS_CXX14_RETURN_TYPE_DEDUCTION 1
403 #endif
404 #endif
405 
406 #if VSMC_INTEL_VERSION >= VSMC_INTEL_NONEXIST
407 #ifndef VSMC_HAS_CXX14_RUNTIME_SIZED_ARRAYS
408 #define VSMC_HAS_CXX14_RUNTIME_SIZED_ARRAYS 1
409 #endif
410 #endif
411 
412 #if VSMC_INTEL_VERSION >= VSMC_INTEL_NONEXIST
413 #ifndef VSMC_HAS_CXX14_VARIABLE_TEMPLATES
414 #define VSMC_HAS_CXX14_VARIABLE_TEMPLATES 1
415 #endif
416 #endif
417 
418 #endif // __cplusplus >= 201402L
419 
420 // C99 library features
421 
422 #ifndef VSMC_HAS_C99LIB_MATH
423 #define VSMC_HAS_C99LIB_MATH 1
424 #endif
425 
426 // Compiler features
427 
428 #ifndef VSMC_INT64
429 #define VSMC_INT64 __int64
430 #endif
431 
432 #ifdef __x86_64__
433 #ifndef VSMC_HAS_INT128
434 #define VSMC_HAS_INT128 1
435 #endif
436 #ifndef VSMC_INT128
437 #define VSMC_INT128 __int128
438 #endif
439 #endif
440 
441 #ifndef VSMC_HAS_WARNING
442 #define VSMC_HAS_WARNING 1
443 #endif
444 
445 #ifndef _WIN32
446 #ifndef VSMC_STRONG_INLINE
447 #define VSMC_STRONG_INLINE __attribute__((always_inline)) inline
448 #endif
449 #endif
450 
451 // Target features
452 
453 #ifdef __AVX__
454 #define VSMC_HAS_AES_NI 1
455 #endif
456 
457 #ifdef __AVX2__
458 #define VSMC_HAS_RDRAND 1
459 #endif
460 
461 // Parallelization features
462 
463 #if VSMC_INTEL_VERSION >= 1210
464 #ifndef VSMC_HAS_CILK
465 #define VSMC_HAS_CILK 1
466 #endif
467 #endif
468 
469 #ifdef _OPENMP
470 #ifndef VSMC_HAS_OMP
471 #define VSMC_HAS_OMP 1
472 #endif
473 #endif
474 
475 #endif // VSMC_INTERNAL_COMPILER_INTEL_HPP