Skip to content

Commit aaf16b8

Browse files
[OpenMP] libomp: eliminate pause from atomic CAS loops
For clang this change is NFC cleanup, because clang never calls atomic functions from runtime library. Basically, pause is good in spin-loops waiting for something. Atomic CAS loops do not wait for anything, each CAS failure means some other thread progressed. Performance experiments show that the pause only causes unnecessary slowdown on CPUs with slow pause instruction, no difference on CPUs with fast pause instruction, removal of the pause gives lesser binary size which is good. Differential Revision: https://reviews.llvm.org/D97079
1 parent b04fbc1 commit aaf16b8

File tree

1 file changed

+1
-11
lines changed

1 file changed

+1
-11
lines changed

openmp/runtime/src/kmp_atomic.cpp

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -779,7 +779,7 @@ static inline kmp_cmplx128_a16_t operator/(kmp_cmplx128_a16_t &lhs,
779779
#if KMP_MIC
780780
#define KMP_DO_PAUSE _mm_delay_32(1)
781781
#else
782-
#define KMP_DO_PAUSE KMP_CPU_PAUSE()
782+
#define KMP_DO_PAUSE
783783
#endif /* KMP_MIC */
784784

785785
// ------------------------------------------------------------------------
@@ -1132,7 +1132,6 @@ ATOMIC_CMPX_L(fixed8, orl, kmp_int64, 64, ||, 8i, 7,
11321132
(kmp_int##BITS *)lhs, \
11331133
*VOLATILE_CAST(kmp_int##BITS *) & old_value, \
11341134
*VOLATILE_CAST(kmp_int##BITS *) & rhs)) { \
1135-
KMP_CPU_PAUSE(); \
11361135
temp_val = *lhs; \
11371136
old_value = temp_val; \
11381137
} \
@@ -2087,8 +2086,6 @@ ATOMIC_CRITICAL_READ(cmplx16, a16_rd, kmp_cmplx128_a16_t, +, 32c,
20872086
while (!KMP_COMPARE_AND_STORE_ACQ##BITS( \
20882087
(kmp_int##BITS *)lhs, *VOLATILE_CAST(kmp_int##BITS *) & old_value, \
20892088
*VOLATILE_CAST(kmp_int##BITS *) & new_value)) { \
2090-
KMP_CPU_PAUSE(); \
2091-
\
20922089
temp_val = *lhs; \
20932090
old_value = temp_val; \
20942091
new_value = rhs; \
@@ -2237,8 +2234,6 @@ ATOMIC_CRITICAL_WR(cmplx16, a16_wr, kmp_cmplx128_a16_t, =, 32c,
22372234
while (!KMP_COMPARE_AND_STORE_ACQ##BITS( \
22382235
(kmp_int##BITS *)lhs, *VOLATILE_CAST(kmp_int##BITS *) & old_value, \
22392236
*VOLATILE_CAST(kmp_int##BITS *) & new_value)) { \
2240-
KMP_CPU_PAUSE(); \
2241-
\
22422237
temp_val = *lhs; \
22432238
old_value = temp_val; \
22442239
new_value = (TYPE)(old_value OP rhs); \
@@ -2633,7 +2628,6 @@ ATOMIC_CMPX_L_CPT(fixed8, orl_cpt, kmp_int64, 64, ||,
26332628
(kmp_int##BITS *)lhs, \
26342629
*VOLATILE_CAST(kmp_int##BITS *) & old_value, \
26352630
*VOLATILE_CAST(kmp_int##BITS *) & rhs)) { \
2636-
KMP_CPU_PAUSE(); \
26372631
temp_val = *lhs; \
26382632
old_value = temp_val; \
26392633
} \
@@ -2930,8 +2924,6 @@ ATOMIC_CRITICAL_CPT(cmplx16, div_a16_cpt, kmp_cmplx128_a16_t, /, 32c,
29302924
while (!KMP_COMPARE_AND_STORE_ACQ##BITS( \
29312925
(kmp_int##BITS *)lhs, *VOLATILE_CAST(kmp_int##BITS *) & old_value, \
29322926
*VOLATILE_CAST(kmp_int##BITS *) & new_value)) { \
2933-
KMP_CPU_PAUSE(); \
2934-
\
29352927
temp_val = *lhs; \
29362928
old_value = temp_val; \
29372929
new_value = (TYPE)(rhs OP old_value); \
@@ -3254,8 +3246,6 @@ ATOMIC_CRITICAL_CPT_REV_MIX(float10, long double, div_cpt_rev, /, fp, _Quad,
32543246
while (!KMP_COMPARE_AND_STORE_ACQ##BITS( \
32553247
(kmp_int##BITS *)lhs, *VOLATILE_CAST(kmp_int##BITS *) & old_value, \
32563248
*VOLATILE_CAST(kmp_int##BITS *) & new_value)) { \
3257-
KMP_CPU_PAUSE(); \
3258-
\
32593249
temp_val = *lhs; \
32603250
old_value = temp_val; \
32613251
new_value = rhs; \

0 commit comments

Comments
 (0)