21 #define KMP_FTN_PLAIN 1 22 #define KMP_FTN_APPEND 2 23 #define KMP_FTN_UPPER 3 29 #define KMP_PTR_SKIP (sizeof(void*)) 36 #define KMP_MEM_CONS_VOLATILE 0 37 #define KMP_MEM_CONS_FENCE 1 39 #ifndef KMP_MEM_CONS_MODEL 40 # define KMP_MEM_CONS_MODEL KMP_MEM_CONS_VOLATILE 44 #define KMP_COMPILER_ICC 0 45 #define KMP_COMPILER_GCC 0 46 #define KMP_COMPILER_CLANG 0 47 #define KMP_COMPILER_MSVC 0 49 #if defined( __INTEL_COMPILER ) 50 # undef KMP_COMPILER_ICC 51 # define KMP_COMPILER_ICC 1 52 #elif defined( __clang__ ) 53 # undef KMP_COMPILER_CLANG 54 # define KMP_COMPILER_CLANG 1 55 #elif defined( __GNUC__ ) 56 # undef KMP_COMPILER_GCC 57 # define KMP_COMPILER_GCC 1 58 #elif defined( _MSC_VER ) 59 # undef KMP_COMPILER_MSVC 60 # define KMP_COMPILER_MSVC 1 62 # error Unknown compiler 65 #include "kmp_platform.h" 67 #if (KMP_OS_LINUX || KMP_OS_WINDOWS) && !KMP_OS_CNK && !KMP_ARCH_PPC64 68 # define KMP_AFFINITY_SUPPORTED 1 69 # if KMP_OS_WINDOWS && KMP_ARCH_X86_64 70 # define KMP_GROUP_AFFINITY 1 72 # define KMP_GROUP_AFFINITY 0 75 # define KMP_AFFINITY_SUPPORTED 0 76 # define KMP_GROUP_AFFINITY 0 80 #define KMP_HAVE_QUAD 0 81 #if KMP_ARCH_X86 || KMP_ARCH_X86_64 85 # define KMP_HAVE_QUAD 1 86 # elif KMP_COMPILER_CLANG 89 typedef long double _Quad;
90 # elif KMP_COMPILER_GCC 91 typedef __float128 _Quad;
93 # define KMP_HAVE_QUAD 1 94 # elif KMP_COMPILER_MSVC 95 typedef long double _Quad;
98 # if __LDBL_MAX_EXP__ >= 16384 && KMP_COMPILER_GCC 99 typedef long double _Quad;
100 # undef KMP_HAVE_QUAD 101 # define KMP_HAVE_QUAD 1 106 typedef char kmp_int8;
107 typedef unsigned char kmp_uint8;
108 typedef short kmp_int16;
109 typedef unsigned short kmp_uint16;
110 typedef int kmp_int32;
111 typedef unsigned int kmp_uint32;
112 # define KMP_INT32_SPEC "d" 113 # define KMP_UINT32_SPEC "u" 114 # ifndef KMP_STRUCT64 115 typedef __int64 kmp_int64;
116 typedef unsigned __int64 kmp_uint64;
117 #define KMP_INT64_SPEC "I64d" 118 #define KMP_UINT64_SPEC "I64u" 120 struct kmp_struct64 {
123 typedef struct kmp_struct64 kmp_int64;
124 typedef struct kmp_struct64 kmp_uint64;
128 # define KMP_INTPTR 1 129 typedef __int64 kmp_intptr_t;
130 typedef unsigned __int64 kmp_uintptr_t;
131 # define KMP_INTPTR_SPEC "I64d" 132 # define KMP_UINTPTR_SPEC "I64u" 137 typedef char kmp_int8;
138 typedef unsigned char kmp_uint8;
139 typedef short kmp_int16;
140 typedef unsigned short kmp_uint16;
141 typedef int kmp_int32;
142 typedef unsigned int kmp_uint32;
143 typedef long long kmp_int64;
144 typedef unsigned long long kmp_uint64;
145 # define KMP_INT32_SPEC "d" 146 # define KMP_UINT32_SPEC "u" 147 # define KMP_INT64_SPEC "lld" 148 # define KMP_UINT64_SPEC "llu" 151 #if KMP_ARCH_X86 || KMP_ARCH_ARM || KMP_ARCH_MIPS 152 # define KMP_SIZE_T_SPEC KMP_UINT32_SPEC 153 #elif KMP_ARCH_X86_64 || KMP_ARCH_PPC64 || KMP_ARCH_AARCH64 || KMP_ARCH_MIPS64 154 # define KMP_SIZE_T_SPEC KMP_UINT64_SPEC 156 # error "Can't determine size_t printf format specifier." 160 # define KMP_SIZE_T_MAX (0xFFFFFFFF) 162 # define KMP_SIZE_T_MAX (0xFFFFFFFFFFFFFFFF) 165 typedef size_t kmp_size_t;
166 typedef float kmp_real32;
167 typedef double kmp_real64;
170 # define KMP_INTPTR 1 171 typedef long kmp_intptr_t;
172 typedef unsigned long kmp_uintptr_t;
173 # define KMP_INTPTR_SPEC "ld" 174 # define KMP_UINTPTR_SPEC "lu" 178 typedef kmp_int64 kmp_int;
179 typedef kmp_uint64 kmp_uint;
180 # define KMP_INT_SPEC KMP_INT64_SPEC 181 # define KMP_UINT_SPEC KMP_UINT64_SPEC 182 # define KMP_INT_MAX ((kmp_int64)0x7FFFFFFFFFFFFFFFLL) 183 # define KMP_INT_MIN ((kmp_int64)0x8000000000000000LL) 185 typedef kmp_int32 kmp_int;
186 typedef kmp_uint32 kmp_uint;
187 # define KMP_INT_SPEC KMP_INT32_SPEC 188 # define KMP_UINT_SPEC KMP_UINT32_SPEC 189 # define KMP_INT_MAX ((kmp_int32)0x7FFFFFFF) 190 # define KMP_INT_MIN ((kmp_int32)0x80000000) 197 template<
typename T >
200 typedef T unsigned_t;
201 typedef T floating_t;
202 static char const * spec;
206 struct traits_t< signed int > {
207 typedef signed int signed_t;
208 typedef unsigned int unsigned_t;
209 typedef double floating_t;
210 static char const * spec;
214 struct traits_t< unsigned int > {
215 typedef signed int signed_t;
216 typedef unsigned int unsigned_t;
217 typedef double floating_t;
218 static char const * spec;
222 struct traits_t< signed long long > {
223 typedef signed long long signed_t;
224 typedef unsigned long long unsigned_t;
225 typedef long double floating_t;
226 static char const * spec;
230 struct traits_t< unsigned long long > {
231 typedef signed long long signed_t;
232 typedef unsigned long long unsigned_t;
233 typedef long double floating_t;
234 static char const * spec;
237 #endif // __cplusplus 239 #define KMP_EXPORT extern 242 #define __forceinline __inline 245 #define PAGE_SIZE (0x4000) 246 #define PAGE_ALIGNED(_addr) ( ! ((size_t) _addr & \ 247 (size_t)(PAGE_SIZE - 1))) 248 #define ALIGN_TO_PAGE(x) (void *)(((size_t)(x)) & ~((size_t)(PAGE_SIZE - 1))) 254 #endif // __cplusplus 256 #define INTERNODE_CACHE_LINE 4096 260 #define CACHE_LINE 128 262 #if ( CACHE_LINE < 64 ) && ! defined( KMP_OS_DARWIN ) 264 #warning CACHE_LINE is too small. 268 #define KMP_CACHE_PREFETCH(ADDR) 272 #if KMP_OS_UNIX && defined(__GNUC__) 273 # define KMP_DO_ALIGN(bytes) __attribute__((aligned(bytes))) 274 # define KMP_ALIGN_CACHE __attribute__((aligned(CACHE_LINE))) 275 # define KMP_ALIGN_CACHE_INTERNODE __attribute__((aligned(INTERNODE_CACHE_LINE))) 276 # define KMP_ALIGN(bytes) __attribute__((aligned(bytes))) 278 # define KMP_DO_ALIGN(bytes) __declspec( align(bytes) ) 279 # define KMP_ALIGN_CACHE __declspec( align(CACHE_LINE) ) 280 # define KMP_ALIGN_CACHE_INTERNODE __declspec( align(INTERNODE_CACHE_LINE) ) 281 # define KMP_ALIGN(bytes) __declspec( align(bytes) ) 284 #if defined(__MIC__) || defined(__MIC2__) 287 # if __MIC2__ || __KNC__ 301 enum kmp_mem_fence_type {
313 #if KMP_ASM_INTRINS && KMP_OS_WINDOWS 317 #pragma intrinsic(InterlockedExchangeAdd) 318 #pragma intrinsic(InterlockedCompareExchange) 319 #pragma intrinsic(InterlockedExchange) 320 #pragma intrinsic(InterlockedExchange64) 326 # define KMP_TEST_THEN_INC32(p) InterlockedExchangeAdd( (volatile long *)(p), 1 ) 327 # define KMP_TEST_THEN_INC_ACQ32(p) InterlockedExchangeAdd( (volatile long *)(p), 1 ) 328 # define KMP_TEST_THEN_ADD4_32(p) InterlockedExchangeAdd( (volatile long *)(p), 4 ) 329 # define KMP_TEST_THEN_ADD4_ACQ32(p) InterlockedExchangeAdd( (volatile long *)(p), 4 ) 330 # define KMP_TEST_THEN_DEC32(p) InterlockedExchangeAdd( (volatile long *)(p), -1 ) 331 # define KMP_TEST_THEN_DEC_ACQ32(p) InterlockedExchangeAdd( (volatile long *)(p), -1 ) 332 # define KMP_TEST_THEN_ADD32(p, v) InterlockedExchangeAdd( (volatile long *)(p), (v) ) 334 extern kmp_int8 __kmp_test_then_add8(
volatile kmp_int8 *p, kmp_int8 v );
335 extern kmp_int8 __kmp_test_then_or8(
volatile kmp_int8 *p, kmp_int8 v );
336 extern kmp_int8 __kmp_test_then_and8(
volatile kmp_int8 *p, kmp_int8 v );
337 # define KMP_COMPARE_AND_STORE_RET32(p, cv, sv) InterlockedCompareExchange( (volatile long *)(p),(long)(sv),(long)(cv) ) 339 # define KMP_XCHG_FIXED32(p, v) InterlockedExchange( (volatile long *)(p), (long)(v) ) 340 # define KMP_XCHG_FIXED64(p, v) InterlockedExchange64( (volatile kmp_int64 *)(p), (kmp_int64)(v) ) 342 inline kmp_real32 KMP_XCHG_REAL32(
volatile kmp_real32 *p, kmp_real32 v)
344 kmp_int32 tmp = InterlockedExchange( (
volatile long *)p, *(
long *)&v);
345 return *(kmp_real32*)&tmp;
351 extern kmp_int32 __kmp_test_then_add32(
volatile kmp_int32 *p, kmp_int32 v );
352 extern kmp_int32 __kmp_test_then_or32(
volatile kmp_int32 *p, kmp_int32 v );
353 extern kmp_int32 __kmp_test_then_and32(
volatile kmp_int32 *p, kmp_int32 v );
354 extern kmp_int64 __kmp_test_then_add64(
volatile kmp_int64 *p, kmp_int64 v );
355 extern kmp_int64 __kmp_test_then_or64(
volatile kmp_int64 *p, kmp_int64 v );
356 extern kmp_int64 __kmp_test_then_and64(
volatile kmp_int64 *p, kmp_int64 v );
358 extern kmp_int8 __kmp_compare_and_store8(
volatile kmp_int8 *p, kmp_int8 cv, kmp_int8 sv );
359 extern kmp_int16 __kmp_compare_and_store16(
volatile kmp_int16 *p, kmp_int16 cv, kmp_int16 sv );
360 extern kmp_int32 __kmp_compare_and_store32(
volatile kmp_int32 *p, kmp_int32 cv, kmp_int32 sv );
361 extern kmp_int32 __kmp_compare_and_store64(
volatile kmp_int64 *p, kmp_int64 cv, kmp_int64 sv );
362 extern kmp_int8 __kmp_compare_and_store_ret8(
volatile kmp_int8 *p, kmp_int8 cv, kmp_int8 sv );
363 extern kmp_int16 __kmp_compare_and_store_ret16(
volatile kmp_int16 *p, kmp_int16 cv, kmp_int16 sv );
364 extern kmp_int32 __kmp_compare_and_store_ret32(
volatile kmp_int32 *p, kmp_int32 cv, kmp_int32 sv );
365 extern kmp_int64 __kmp_compare_and_store_ret64(
volatile kmp_int64 *p, kmp_int64 cv, kmp_int64 sv );
367 extern kmp_int8 __kmp_xchg_fixed8(
volatile kmp_int8 *p, kmp_int8 v );
368 extern kmp_int16 __kmp_xchg_fixed16(
volatile kmp_int16 *p, kmp_int16 v );
369 extern kmp_int32 __kmp_xchg_fixed32(
volatile kmp_int32 *p, kmp_int32 v );
370 extern kmp_int64 __kmp_xchg_fixed64(
volatile kmp_int64 *p, kmp_int64 v );
371 extern kmp_real32 __kmp_xchg_real32(
volatile kmp_real32 *p, kmp_real32 v );
372 extern kmp_real64 __kmp_xchg_real64(
volatile kmp_real64 *p, kmp_real64 v );
373 # define KMP_TEST_THEN_ADD8(p, v) __kmp_test_then_add8( (p), (v) ) 376 # define KMP_TEST_THEN_OR8(p, v) __kmp_test_then_or8( (p), (v) ) 377 # define KMP_TEST_THEN_AND8(p, v) __kmp_test_then_and8( (p), (v) ) 379 # define KMP_TEST_THEN_INC64(p) __kmp_test_then_add64( (p), 1LL ) 380 # define KMP_TEST_THEN_INC_ACQ64(p) __kmp_test_then_add64( (p), 1LL ) 383 # define KMP_TEST_THEN_ADD4_64(p) __kmp_test_then_add64( (p), 4LL ) 384 # define KMP_TEST_THEN_ADD4_ACQ64(p) __kmp_test_then_add64( (p), 4LL ) 387 # define KMP_TEST_THEN_DEC64(p) __kmp_test_then_add64( (p), -1LL ) 388 # define KMP_TEST_THEN_DEC_ACQ64(p) __kmp_test_then_add64( (p), -1LL ) 390 # define KMP_TEST_THEN_ADD64(p, v) __kmp_test_then_add64( (p), (v) ) 392 # define KMP_TEST_THEN_OR32(p, v) __kmp_test_then_or32( (p), (v) ) 393 # define KMP_TEST_THEN_AND32(p, v) __kmp_test_then_and32( (p), (v) ) 394 # define KMP_TEST_THEN_OR64(p, v) __kmp_test_then_or64( (p), (v) ) 395 # define KMP_TEST_THEN_AND64(p, v) __kmp_test_then_and64( (p), (v) ) 397 # define KMP_COMPARE_AND_STORE_ACQ8(p, cv, sv) __kmp_compare_and_store8( (p), (cv), (sv) ) 398 # define KMP_COMPARE_AND_STORE_REL8(p, cv, sv) __kmp_compare_and_store8( (p), (cv), (sv) ) 399 # define KMP_COMPARE_AND_STORE_ACQ16(p, cv, sv) __kmp_compare_and_store16( (p), (cv), (sv) ) 400 # define KMP_COMPARE_AND_STORE_REL16(p, cv, sv) __kmp_compare_and_store16( (p), (cv), (sv) ) 401 # define KMP_COMPARE_AND_STORE_ACQ32(p, cv, sv) __kmp_compare_and_store32( (p), (cv), (sv) ) 402 # define KMP_COMPARE_AND_STORE_REL32(p, cv, sv) __kmp_compare_and_store32( (p), (cv), (sv) ) 403 # define KMP_COMPARE_AND_STORE_ACQ64(p, cv, sv) __kmp_compare_and_store64( (p), (cv), (sv) ) 404 # define KMP_COMPARE_AND_STORE_REL64(p, cv, sv) __kmp_compare_and_store64( (p), (cv), (sv) ) 407 # define KMP_COMPARE_AND_STORE_PTR(p, cv, sv) __kmp_compare_and_store32( (volatile kmp_int32*)(p), (kmp_int32)(cv), (kmp_int32)(sv) ) 409 # define KMP_COMPARE_AND_STORE_PTR(p, cv, sv) __kmp_compare_and_store64( (volatile kmp_int64*)(p), (kmp_int64)(cv), (kmp_int64)(sv) ) 412 # define KMP_COMPARE_AND_STORE_RET8(p, cv, sv) __kmp_compare_and_store_ret8( (p), (cv), (sv) ) 413 # define KMP_COMPARE_AND_STORE_RET16(p, cv, sv) __kmp_compare_and_store_ret16( (p), (cv), (sv) ) 415 # define KMP_COMPARE_AND_STORE_RET64(p, cv, sv) __kmp_compare_and_store_ret64( (p), (cv), (sv) ) 417 # define KMP_XCHG_FIXED8(p, v) __kmp_xchg_fixed8( (p), (v) ); 418 # define KMP_XCHG_FIXED16(p, v) __kmp_xchg_fixed16( (p), (v) ); 422 # define KMP_XCHG_REAL64(p, v) __kmp_xchg_real64( (p), (v) ); 425 #elif (KMP_ASM_INTRINS && KMP_OS_UNIX) || !(KMP_ARCH_X86 || KMP_ARCH_X86_64) 426 # define KMP_TEST_THEN_ADD8(p, v) __sync_fetch_and_add( (kmp_int8 *)(p), (v) ) 429 # define KMP_TEST_THEN_INC32(p) __sync_fetch_and_add( (kmp_int32 *)(p), 1 ) 430 # define KMP_TEST_THEN_OR8(p, v) __sync_fetch_and_or( (kmp_int8 *)(p), (v) ) 431 # define KMP_TEST_THEN_AND8(p, v) __sync_fetch_and_and( (kmp_int8 *)(p), (v) ) 432 # define KMP_TEST_THEN_INC_ACQ32(p) __sync_fetch_and_add( (kmp_int32 *)(p), 1 ) 433 # define KMP_TEST_THEN_INC64(p) __sync_fetch_and_add( (kmp_int64 *)(p), 1LL ) 434 # define KMP_TEST_THEN_INC_ACQ64(p) __sync_fetch_and_add( (kmp_int64 *)(p), 1LL ) 435 # define KMP_TEST_THEN_ADD4_32(p) __sync_fetch_and_add( (kmp_int32 *)(p), 4 ) 436 # define KMP_TEST_THEN_ADD4_ACQ32(p) __sync_fetch_and_add( (kmp_int32 *)(p), 4 ) 437 # define KMP_TEST_THEN_ADD4_64(p) __sync_fetch_and_add( (kmp_int64 *)(p), 4LL ) 438 # define KMP_TEST_THEN_ADD4_ACQ64(p) __sync_fetch_and_add( (kmp_int64 *)(p), 4LL ) 439 # define KMP_TEST_THEN_DEC32(p) __sync_fetch_and_sub( (kmp_int32 *)(p), 1 ) 440 # define KMP_TEST_THEN_DEC_ACQ32(p) __sync_fetch_and_sub( (kmp_int32 *)(p), 1 ) 441 # define KMP_TEST_THEN_DEC64(p) __sync_fetch_and_sub( (kmp_int64 *)(p), 1LL ) 442 # define KMP_TEST_THEN_DEC_ACQ64(p) __sync_fetch_and_sub( (kmp_int64 *)(p), 1LL ) 443 # define KMP_TEST_THEN_ADD32(p, v) __sync_fetch_and_add( (kmp_int32 *)(p), (v) ) 444 # define KMP_TEST_THEN_ADD64(p, v) __sync_fetch_and_add( (kmp_int64 *)(p), (v) ) 446 # define KMP_TEST_THEN_OR32(p, v) __sync_fetch_and_or( (kmp_int32 *)(p), (v) ) 447 # define KMP_TEST_THEN_AND32(p, v) __sync_fetch_and_and( (kmp_int32 *)(p), (v) ) 448 # define KMP_TEST_THEN_OR64(p, v) __sync_fetch_and_or( (kmp_int64 *)(p), (v) ) 449 # define KMP_TEST_THEN_AND64(p, v) __sync_fetch_and_and( (kmp_int64 *)(p), (v) ) 451 # define KMP_COMPARE_AND_STORE_ACQ8(p, cv, sv) __sync_bool_compare_and_swap( (volatile kmp_uint8 *)(p),(kmp_uint8)(cv),(kmp_uint8)(sv) ) 452 # define KMP_COMPARE_AND_STORE_REL8(p, cv, sv) __sync_bool_compare_and_swap( (volatile kmp_uint8 *)(p),(kmp_uint8)(cv),(kmp_uint8)(sv) ) 453 # define KMP_COMPARE_AND_STORE_ACQ16(p, cv, sv) __sync_bool_compare_and_swap( (volatile kmp_uint16 *)(p),(kmp_uint16)(cv),(kmp_uint16)(sv) ) 454 # define KMP_COMPARE_AND_STORE_REL16(p, cv, sv) __sync_bool_compare_and_swap( (volatile kmp_uint16 *)(p),(kmp_uint16)(cv),(kmp_uint16)(sv) ) 455 # define KMP_COMPARE_AND_STORE_ACQ32(p, cv, sv) __sync_bool_compare_and_swap( (volatile kmp_uint32 *)(p),(kmp_uint32)(cv),(kmp_uint32)(sv) ) 456 # define KMP_COMPARE_AND_STORE_REL32(p, cv, sv) __sync_bool_compare_and_swap( (volatile kmp_uint32 *)(p),(kmp_uint32)(cv),(kmp_uint32)(sv) ) 457 # define KMP_COMPARE_AND_STORE_ACQ64(p, cv, sv) __sync_bool_compare_and_swap( (volatile kmp_uint64 *)(p),(kmp_uint64)(cv),(kmp_uint64)(sv) ) 458 # define KMP_COMPARE_AND_STORE_REL64(p, cv, sv) __sync_bool_compare_and_swap( (volatile kmp_uint64 *)(p),(kmp_uint64)(cv),(kmp_uint64)(sv) ) 459 # define KMP_COMPARE_AND_STORE_PTR(p, cv, sv) __sync_bool_compare_and_swap( (volatile void **)(p),(void *)(cv),(void *)(sv) ) 461 # define KMP_COMPARE_AND_STORE_RET8(p, cv, sv) __sync_val_compare_and_swap( (volatile kmp_uint8 *)(p),(kmp_uint8)(cv),(kmp_uint8)(sv) ) 462 # define KMP_COMPARE_AND_STORE_RET16(p, cv, sv) __sync_val_compare_and_swap( (volatile kmp_uint16 *)(p),(kmp_uint16)(cv),(kmp_uint16)(sv) ) 463 # define KMP_COMPARE_AND_STORE_RET32(p, cv, sv) __sync_val_compare_and_swap( (volatile kmp_uint32 *)(p),(kmp_uint32)(cv),(kmp_uint32)(sv) ) 464 # define KMP_COMPARE_AND_STORE_RET64(p, cv, sv) __sync_val_compare_and_swap( (volatile kmp_uint64 *)(p),(kmp_uint64)(cv),(kmp_uint64)(sv) ) 466 #define KMP_XCHG_FIXED8(p, v) __sync_lock_test_and_set( (volatile kmp_uint8 *)(p), (kmp_uint8)(v) ) 467 #define KMP_XCHG_FIXED16(p, v) __sync_lock_test_and_set( (volatile kmp_uint16 *)(p), (kmp_uint16)(v) ) 468 #define KMP_XCHG_FIXED32(p, v) __sync_lock_test_and_set( (volatile kmp_uint32 *)(p), (kmp_uint32)(v) ) 469 #define KMP_XCHG_FIXED64(p, v) __sync_lock_test_and_set( (volatile kmp_uint64 *)(p), (kmp_uint64)(v) ) 471 extern kmp_int8 __kmp_test_then_add8(
volatile kmp_int8 *p, kmp_int8 v );
472 extern kmp_int8 __kmp_test_then_or8(
volatile kmp_int8 *p, kmp_int8 v );
473 extern kmp_int8 __kmp_test_then_and8(
volatile kmp_int8 *p, kmp_int8 v );
474 inline kmp_real32 KMP_XCHG_REAL32(
volatile kmp_real32 *p, kmp_real32 v)
476 kmp_int32 tmp = __sync_lock_test_and_set( (kmp_int32*)p, *(kmp_int32*)&v);
477 return *(kmp_real32*)&tmp;
480 inline kmp_real64 KMP_XCHG_REAL64(
volatile kmp_real64 *p, kmp_real64 v)
482 kmp_int64 tmp = __sync_lock_test_and_set( (kmp_int64*)p, *(kmp_int64*)&v);
483 return *(kmp_real64*)&tmp;
488 extern kmp_int32 __kmp_test_then_add32(
volatile kmp_int32 *p, kmp_int32 v );
489 extern kmp_int32 __kmp_test_then_or32(
volatile kmp_int32 *p, kmp_int32 v );
490 extern kmp_int32 __kmp_test_then_and32(
volatile kmp_int32 *p, kmp_int32 v );
491 extern kmp_int64 __kmp_test_then_add64(
volatile kmp_int64 *p, kmp_int64 v );
492 extern kmp_int64 __kmp_test_then_or64(
volatile kmp_int64 *p, kmp_int64 v );
493 extern kmp_int64 __kmp_test_then_and64(
volatile kmp_int64 *p, kmp_int64 v );
495 extern kmp_int8 __kmp_compare_and_store8(
volatile kmp_int8 *p, kmp_int8 cv, kmp_int8 sv );
496 extern kmp_int16 __kmp_compare_and_store16(
volatile kmp_int16 *p, kmp_int16 cv, kmp_int16 sv );
497 extern kmp_int32 __kmp_compare_and_store32(
volatile kmp_int32 *p, kmp_int32 cv, kmp_int32 sv );
498 extern kmp_int32 __kmp_compare_and_store64(
volatile kmp_int64 *p, kmp_int64 cv, kmp_int64 sv );
499 extern kmp_int8 __kmp_compare_and_store_ret8(
volatile kmp_int8 *p, kmp_int8 cv, kmp_int8 sv );
500 extern kmp_int16 __kmp_compare_and_store_ret16(
volatile kmp_int16 *p, kmp_int16 cv, kmp_int16 sv );
501 extern kmp_int32 __kmp_compare_and_store_ret32(
volatile kmp_int32 *p, kmp_int32 cv, kmp_int32 sv );
502 extern kmp_int64 __kmp_compare_and_store_ret64(
volatile kmp_int64 *p, kmp_int64 cv, kmp_int64 sv );
504 extern kmp_int8 __kmp_xchg_fixed8(
volatile kmp_int8 *p, kmp_int8 v );
505 extern kmp_int16 __kmp_xchg_fixed16(
volatile kmp_int16 *p, kmp_int16 v );
506 extern kmp_int32 __kmp_xchg_fixed32(
volatile kmp_int32 *p, kmp_int32 v );
507 extern kmp_int64 __kmp_xchg_fixed64(
volatile kmp_int64 *p, kmp_int64 v );
508 extern kmp_real32 __kmp_xchg_real32(
volatile kmp_real32 *p, kmp_real32 v );
509 # define KMP_TEST_THEN_ADD8(p, v) __kmp_test_then_add8( (p), (v) ) 510 extern kmp_real64 __kmp_xchg_real64(
volatile kmp_real64 *p, kmp_real64 v );
512 # define KMP_TEST_THEN_INC32(p) __kmp_test_then_add32( (p), 1 ) 513 # define KMP_TEST_THEN_OR8(p, v) __kmp_test_then_or8( (p), (v) ) 514 # define KMP_TEST_THEN_AND8(p, v) __kmp_test_then_and8( (p), (v) ) 515 # define KMP_TEST_THEN_INC_ACQ32(p) __kmp_test_then_add32( (p), 1 ) 516 # define KMP_TEST_THEN_INC64(p) __kmp_test_then_add64( (p), 1LL ) 517 # define KMP_TEST_THEN_INC_ACQ64(p) __kmp_test_then_add64( (p), 1LL ) 518 # define KMP_TEST_THEN_ADD4_32(p) __kmp_test_then_add32( (p), 4 ) 519 # define KMP_TEST_THEN_ADD4_ACQ32(p) __kmp_test_then_add32( (p), 4 ) 520 # define KMP_TEST_THEN_ADD4_64(p) __kmp_test_then_add64( (p), 4LL ) 521 # define KMP_TEST_THEN_ADD4_ACQ64(p) __kmp_test_then_add64( (p), 4LL ) 522 # define KMP_TEST_THEN_DEC32(p) __kmp_test_then_add32( (p), -1 ) 523 # define KMP_TEST_THEN_DEC_ACQ32(p) __kmp_test_then_add32( (p), -1 ) 524 # define KMP_TEST_THEN_DEC64(p) __kmp_test_then_add64( (p), -1LL ) 525 # define KMP_TEST_THEN_DEC_ACQ64(p) __kmp_test_then_add64( (p), -1LL ) 526 # define KMP_TEST_THEN_ADD32(p, v) __kmp_test_then_add32( (p), (v) ) 527 # define KMP_TEST_THEN_ADD64(p, v) __kmp_test_then_add64( (p), (v) ) 529 # define KMP_TEST_THEN_OR32(p, v) __kmp_test_then_or32( (p), (v) ) 530 # define KMP_TEST_THEN_AND32(p, v) __kmp_test_then_and32( (p), (v) ) 531 # define KMP_TEST_THEN_OR64(p, v) __kmp_test_then_or64( (p), (v) ) 532 # define KMP_TEST_THEN_AND64(p, v) __kmp_test_then_and64( (p), (v) ) 534 # define KMP_COMPARE_AND_STORE_ACQ8(p, cv, sv) __kmp_compare_and_store8( (p), (cv), (sv) ) 535 # define KMP_COMPARE_AND_STORE_REL8(p, cv, sv) __kmp_compare_and_store8( (p), (cv), (sv) ) 536 # define KMP_COMPARE_AND_STORE_ACQ16(p, cv, sv) __kmp_compare_and_store16( (p), (cv), (sv) ) 537 # define KMP_COMPARE_AND_STORE_REL16(p, cv, sv) __kmp_compare_and_store16( (p), (cv), (sv) ) 538 # define KMP_COMPARE_AND_STORE_ACQ32(p, cv, sv) __kmp_compare_and_store32( (p), (cv), (sv) ) 539 # define KMP_COMPARE_AND_STORE_REL32(p, cv, sv) __kmp_compare_and_store32( (p), (cv), (sv) ) 540 # define KMP_COMPARE_AND_STORE_ACQ64(p, cv, sv) __kmp_compare_and_store64( (p), (cv), (sv) ) 541 # define KMP_COMPARE_AND_STORE_REL64(p, cv, sv) __kmp_compare_and_store64( (p), (cv), (sv) ) 544 # define KMP_COMPARE_AND_STORE_PTR(p, cv, sv) __kmp_compare_and_store32( (volatile kmp_int32*)(p), (kmp_int32)(cv), (kmp_int32)(sv) ) 546 # define KMP_COMPARE_AND_STORE_PTR(p, cv, sv) __kmp_compare_and_store64( (volatile kmp_int64*)(p), (kmp_int64)(cv), (kmp_int64)(sv) ) 549 # define KMP_COMPARE_AND_STORE_RET8(p, cv, sv) __kmp_compare_and_store_ret8( (p), (cv), (sv) ) 550 # define KMP_COMPARE_AND_STORE_RET16(p, cv, sv) __kmp_compare_and_store_ret16( (p), (cv), (sv) ) 551 # define KMP_COMPARE_AND_STORE_RET32(p, cv, sv) __kmp_compare_and_store_ret32( (p), (cv), (sv) ) 552 # define KMP_COMPARE_AND_STORE_RET64(p, cv, sv) __kmp_compare_and_store_ret64( (p), (cv), (sv) ) 554 # define KMP_XCHG_FIXED8(p, v) __kmp_xchg_fixed8( (p), (v) ); 555 # define KMP_XCHG_FIXED16(p, v) __kmp_xchg_fixed16( (p), (v) ); 556 # define KMP_XCHG_FIXED32(p, v) __kmp_xchg_fixed32( (p), (v) ); 557 # define KMP_XCHG_FIXED64(p, v) __kmp_xchg_fixed64( (p), (v) ); 558 # define KMP_XCHG_REAL32(p, v) __kmp_xchg_real32( (p), (v) ); 559 # define KMP_XCHG_REAL64(p, v) __kmp_xchg_real64( (p), (v) ); 568 # define KMP_MB() asm ("nop") 569 # define KMP_IMB() asm ("nop") 576 #if KMP_ARCH_PPC64 || KMP_ARCH_ARM || KMP_ARCH_AARCH64 || KMP_ARCH_MIPS || KMP_ARCH_MIPS64 577 # define KMP_MB() __sync_synchronize() 589 # define KMP_ST_REL32(A,D) ( *(A) = (D) ) 593 # define KMP_ST_REL64(A,D) ( *(A) = (D) ) 597 # define KMP_LD_ACQ32(A) ( *(A) ) 601 # define KMP_LD_ACQ64(A) ( *(A) ) 605 #define TCW_1(a,b) (a) = (b) 621 #define TCW_4(a,b) (a) = (b) 623 #define TCW_8(a,b) (a) = (b) 624 #define TCR_SYNC_4(a) (a) 625 #define TCW_SYNC_4(a,b) (a) = (b) 626 #define TCX_SYNC_4(a,b,c) KMP_COMPARE_AND_STORE_REL32((volatile kmp_int32 *)(volatile void *)&(a), (kmp_int32)(b), (kmp_int32)(c)) 627 #define TCR_SYNC_8(a) (a) 628 #define TCW_SYNC_8(a,b) (a) = (b) 629 #define TCX_SYNC_8(a,b,c) KMP_COMPARE_AND_STORE_REL64((volatile kmp_int64 *)(volatile void *)&(a), (kmp_int64)(b), (kmp_int64)(c)) 631 #if KMP_ARCH_X86 || KMP_ARCH_MIPS 633 #define TCR_PTR(a) ((void *)TCR_4(a)) 634 #define TCW_PTR(a,b) TCW_4((a),(b)) 635 #define TCR_SYNC_PTR(a) ((void *)TCR_SYNC_4(a)) 636 #define TCW_SYNC_PTR(a,b) TCW_SYNC_4((a),(b)) 637 #define TCX_SYNC_PTR(a,b,c) ((void *)TCX_SYNC_4((a),(b),(c))) 641 #define TCR_PTR(a) ((void *)TCR_8(a)) 642 #define TCW_PTR(a,b) TCW_8((a),(b)) 643 #define TCR_SYNC_PTR(a) ((void *)TCR_SYNC_8(a)) 644 #define TCW_SYNC_PTR(a,b) TCW_SYNC_8((a),(b)) 645 #define TCX_SYNC_PTR(a,b,c) ((void *)TCX_SYNC_8((a),(b),(c))) 656 # define FTN_TRUE TRUE 660 # define FTN_FALSE FALSE 663 typedef void (*microtask_t)(
int *gtid,
int *npr, ... );
665 #ifdef USE_VOLATILE_CAST 666 # define VOLATILE_CAST(x) (volatile x) 668 # define VOLATILE_CAST(x) (x) 672 # define KMP_WAIT_YIELD __kmp_wait_yield_8 673 # define KMP_EQ __kmp_eq_8 674 # define KMP_NEQ __kmp_neq_8 675 # define KMP_LT __kmp_lt_8 676 # define KMP_GE __kmp_ge_8 677 # define KMP_LE __kmp_le_8 679 # define KMP_WAIT_YIELD __kmp_wait_yield_4 680 # define KMP_EQ __kmp_eq_4 681 # define KMP_NEQ __kmp_neq_4 682 # define KMP_LT __kmp_lt_4 683 # define KMP_GE __kmp_ge_4 684 # define KMP_LE __kmp_le_4 688 #if (KMP_ARCH_X86_64 || KMP_ARCH_PPC64) && KMP_OS_LINUX 689 # define STATIC_EFI2_WORKAROUND 691 # define STATIC_EFI2_WORKAROUND static 696 #define KMP_USE_BGET 1 701 #ifndef USE_SYSFS_INFO 702 # define USE_SYSFS_INFO 0 704 #ifndef USE_CMPXCHG_FIX 705 # define USE_CMPXCHG_FIX 1 709 #ifndef KMP_USE_DYNAMIC_LOCK 710 # define KMP_USE_DYNAMIC_LOCK 0 714 enum kmp_warnings_level {
715 kmp_warnings_off = 0,
717 kmp_warnings_explicit = 6,
723 #endif // __cplusplus 727 #include "kmp_safe_c_api.h"