Skip to content

Commit

Permalink
[OpenMP][libomp] Cleanup __kmpc_flush() code
Browse files Browse the repository at this point in the history
Have it be simple KMP_MFENCE() which incorporates x86-specific logic and
reduces to KMP_MB() for other architectures.

Differential Revision: https://reviews.llvm.org/D130928
  • Loading branch information
jpeyton52 committed Sep 8, 2022
1 parent 1cf5c7f commit e5ac98f
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 39 deletions.
40 changes: 1 addition & 39 deletions openmp/runtime/src/kmp_csupport.cpp
Expand Up @@ -668,45 +668,7 @@ void __kmpc_flush(ident_t *loc) {
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) {
Expand Down
10 changes: 10 additions & 0 deletions openmp/runtime/src/kmp_os.h
Expand Up @@ -1058,6 +1058,15 @@ extern kmp_real64 __kmp_xchg_real64(volatile kmp_real64 *p, kmp_real64 v);
#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()
Expand All @@ -1076,6 +1085,7 @@ extern kmp_real64 __kmp_xchg_real64(volatile kmp_real64 *p, kmp_real64 v);
KMP_MFENCE_(); \
}
#define KMP_SFENCE() KMP_SFENCE_()
#endif
#else
#define KMP_MFENCE() KMP_MB()
#define KMP_SFENCE() KMP_MB()
Expand Down

0 comments on commit e5ac98f

Please sign in to comment.