[Openmp-commits] [PATCH] D112874: [OpenMP][FIX] Avoid a race between initialization and first state reads
Johannes Doerfert via Phabricator via Openmp-commits
openmp-commits at lists.llvm.org
Sat Oct 30 12:26:19 PDT 2021
jdoerfert created this revision.
jdoerfert added reviewers: jhuber6, tianshilei1992.
Herald added subscribers: guansong, bollu, yaxunl.
jdoerfert requested review of this revision.
Herald added a subscriber: sstefan1.
Herald added a project: OpenMP.
When we pick state 0 to initialize state but thread N is going to be the
"main thread", in generic mode, we would require extra synchronization.
Instead, we should pick the main thread to initialize state in generic
mode and any thread in SPMD mode.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D112874
Files:
openmp/libomptarget/DeviceRTL/include/Mapping.h
openmp/libomptarget/DeviceRTL/src/Mapping.cpp
openmp/libomptarget/DeviceRTL/src/State.cpp
Index: openmp/libomptarget/DeviceRTL/src/State.cpp
===================================================================
--- openmp/libomptarget/DeviceRTL/src/State.cpp
+++ openmp/libomptarget/DeviceRTL/src/State.cpp
@@ -366,7 +366,7 @@
void state::init(bool IsSPMD) {
SharedMemorySmartStack.init(IsSPMD);
- if (!mapping::getThreadIdInBlock())
+ if (mapping::isInitializationThread(IsSPMD))
TeamState.init(IsSPMD);
ThreadStates[mapping::getThreadIdInBlock()] = nullptr;
Index: openmp/libomptarget/DeviceRTL/src/Mapping.cpp
===================================================================
--- openmp/libomptarget/DeviceRTL/src/Mapping.cpp
+++ openmp/libomptarget/DeviceRTL/src/Mapping.cpp
@@ -178,6 +178,12 @@
return mapping::isMainThreadInGenericMode(mapping::isSPMDMode());
}
+bool mapping::isInitializationThread(bool IsSPMD) {
+ if (IsSPMD)
+ return mapping::getThreadIdInBlock() == 0;
+ return mapping::isMainThreadInGenericMode(IsSPMD);
+}
+
bool mapping::isLeaderInWarp() {
__kmpc_impl_lanemask_t Active = mapping::activemask();
__kmpc_impl_lanemask_t LaneMaskLT = mapping::lanemaskLT();
@@ -220,7 +226,7 @@
static int SHARED(IsSPMDMode);
void mapping::init(bool IsSPMD) {
- if (!mapping::getThreadIdInBlock())
+ if (mapping::isInitializationThread(IsSPMD))
IsSPMDMode = IsSPMD;
}
Index: openmp/libomptarget/DeviceRTL/include/Mapping.h
===================================================================
--- openmp/libomptarget/DeviceRTL/include/Mapping.h
+++ openmp/libomptarget/DeviceRTL/include/Mapping.h
@@ -37,6 +37,11 @@
bool isMainThreadInGenericMode();
bool isMainThreadInGenericMode(bool IsSPMD);
+/// Return true if this thread should be used for single threaded
+/// initialization tasks. We pick a special thread to ensure there are no
+/// races between the initialization and the first read of initialized state.
+bool isInitializationThread(bool IsSPMD);
+
/// Return true if the executing thread has the lowest Id of the active threads
/// in the warp.
bool isLeaderInWarp();
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D112874.383612.patch
Type: text/x-patch
Size: 2056 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/openmp-commits/attachments/20211030/acf4b5b0/attachment.bin>
More information about the Openmp-commits
mailing list