[clang] [llvm] [openmp] [OpenMP][offload] Fix dynamic schedule tracking (PR #97065)
Shilei Tian via cfe-commits
cfe-commits at lists.llvm.org
Fri Jun 28 09:05:13 PDT 2024
================
@@ -444,32 +444,81 @@ template <typename T, typename ST> struct omptarget_nvptx_LoopSupport {
// KMP interface implementation (dyn loops)
////////////////////////////////////////////////////////////////////////////////
-// TODO: This is a stopgap. We probably want to expand the dispatch API to take
-// an DST pointer which can then be allocated properly without malloc.
-static DynamicScheduleTracker *THREAD_LOCAL(ThreadDSTPtr);
+// TODO: Expand the dispatch API to take a DST pointer which can then be
+// allocated properly without malloc.
+// For now, each team will contain an LDS pointer (ThreadDST) to a global array
+// of references to the DST structs allocated (in global memory) for each thread
+// in the team. The global memory array is allocated during the init phase if it
+// was not allocated already and will be deallocated when the dispatch phase
+// ends:
+//
+// __kmpc_dispatch_init
+//
+// ** Dispatch loop **
+//
+// __kmpc_dispatch_deinit
+//
+static DynamicScheduleTracker **SHARED(ThreadDST);
// Create a new DST, link the current one, and define the new as current.
static DynamicScheduleTracker *pushDST() {
+ int32_t ThreadIndex = mapping::getThreadIdInBlock();
+ // Each block will allocate an array of pointers to DST structs. The array is
+ // equal in length to the number of threads in that block.
+ if (!ThreadDST) {
+ // Allocate global memory array of pointers to DST structs:
+ if (ThreadIndex == 0)
----------------
shiltian wrote:
This doesn't sound right. IIUC, in generic mode, this function needs to be called by the main thread before waking up worker threads.
https://github.com/llvm/llvm-project/pull/97065
More information about the cfe-commits
mailing list