diff --git a/openmp/runtime/src/kmp_csupport.cpp b/openmp/runtime/src/kmp_csupport.cpp --- a/openmp/runtime/src/kmp_csupport.cpp +++ b/openmp/runtime/src/kmp_csupport.cpp @@ -668,45 +668,7 @@ KC_TRACE(10, ("__kmpc_flush: called\n")); /* need explicit __mf() here since use volatile instead in library */ - KMP_MB(); /* Flush all pending memory write invalidates. */ - -#if (KMP_ARCH_X86 || KMP_ARCH_X86_64) -#if KMP_MIC -// fence-style instructions do not exist, but lock; xaddl $0,(%rsp) can be used. -// We shouldn't need it, though, since the ABI rules require that -// * If the compiler generates NGO stores it also generates the fence -// * If users hand-code NGO stores they should insert the fence -// therefore no incomplete unordered stores should be visible. -#else - // C74404 - // This is to address non-temporal store instructions (sfence needed). - // The clflush instruction is addressed either (mfence needed). - // Probably the non-temporal load monvtdqa instruction should also be - // addressed. - // mfence is a SSE2 instruction. Do not execute it if CPU is not SSE2. - if (!__kmp_cpuinfo.initialized) { - __kmp_query_cpuid(&__kmp_cpuinfo); - } - if (!__kmp_cpuinfo.flags.sse2) { - // CPU cannot execute SSE2 instructions. - } else { -#if KMP_COMPILER_ICC || KMP_COMPILER_ICX - _mm_mfence(); -#elif KMP_COMPILER_MSVC - MemoryBarrier(); -#else - __sync_synchronize(); -#endif // KMP_COMPILER_ICC || KMP_COMPILER_ICX - } -#endif // KMP_MIC -#elif (KMP_ARCH_ARM || KMP_ARCH_AARCH64 || KMP_ARCH_MIPS || KMP_ARCH_MIPS64 || \ - KMP_ARCH_RISCV64) -// Nothing to see here move along -#elif KMP_ARCH_PPC64 -// Nothing needed here (we have a real MB above). -#else -#error Unknown or unsupported architecture -#endif + KMP_MFENCE(); /* Flush all pending memory write invalidates. */ #if OMPT_SUPPORT && OMPT_OPTIONAL if (ompt_enabled.ompt_callback_flush) { diff --git a/openmp/runtime/src/kmp_os.h b/openmp/runtime/src/kmp_os.h --- a/openmp/runtime/src/kmp_os.h +++ b/openmp/runtime/src/kmp_os.h @@ -1058,6 +1058,15 @@ #endif #if KMP_ARCH_X86 || KMP_ARCH_X86_64 +#if KMP_MIC +// fence-style instructions do not exist, but lock; xaddl $0,(%rsp) can be used. +// We shouldn't need it, though, since the ABI rules require that +// * If the compiler generates NGO stores it also generates the fence +// * If users hand-code NGO stores they should insert the fence +// therefore no incomplete unordered stores should be visible. +#define KMP_MFENCE() /* Nothing */ +#define KMP_SFENCE() /* Nothing */ +#else #if KMP_COMPILER_ICC || KMP_COMPILER_ICX #define KMP_MFENCE_() _mm_mfence() #define KMP_SFENCE_() _mm_sfence() @@ -1076,6 +1085,7 @@ KMP_MFENCE_(); \ } #define KMP_SFENCE() KMP_SFENCE_() +#endif #else #define KMP_MFENCE() KMP_MB() #define KMP_SFENCE() KMP_MB()