[Openmp-commits] [PATCH] D44537: [OpenMP][libomptarget] Fix master warp check

Gheorghe-Teodor Bercea via Phabricator via Openmp-commits openmp-commits at lists.llvm.org
Thu Mar 15 13:38:26 PDT 2018


gtbercea updated this revision to Diff 138617.
gtbercea retitled this revision from "[OpenMP][libomptarget] Fix master warp check " to "[OpenMP][libomptarget] Fix master warp check".
gtbercea added a comment.

Insert guards in init function.


Repository:
  rOMP OpenMP

https://reviews.llvm.org/D44537

Files:
  libomptarget/deviceRTLs/nvptx/src/data_sharing.cu
  libomptarget/deviceRTLs/nvptx/src/omptarget-nvptx.cu
  libomptarget/deviceRTLs/nvptx/src/omptarget-nvptx.h


Index: libomptarget/deviceRTLs/nvptx/src/omptarget-nvptx.h
===================================================================
--- libomptarget/deviceRTLs/nvptx/src/omptarget-nvptx.h
+++ libomptarget/deviceRTLs/nvptx/src/omptarget-nvptx.h
@@ -259,10 +259,10 @@
   // init
   INLINE void InitTeamDescr();
 
-  INLINE __kmpc_data_sharing_slot *RootS(int wid) {
+  INLINE __kmpc_data_sharing_slot *RootS(int wid, bool IsMasterThread) {
     // If this is invoked by the master thread of the master warp then intialize
     // it with a smaller slot.
-    if (wid == WARPSIZE - 1) {
+    if (IsMasterThread) {
       // Initialize the pointer to the end of the slot given the size of the
       // data section. DataEnd is non-inclusive.
       master_rootS[0].DataEnd = &master_rootS[0].Data[0] + DS_Slot_Size;
Index: libomptarget/deviceRTLs/nvptx/src/omptarget-nvptx.cu
===================================================================
--- libomptarget/deviceRTLs/nvptx/src/omptarget-nvptx.cu
+++ libomptarget/deviceRTLs/nvptx/src/omptarget-nvptx.cu
@@ -168,7 +168,8 @@
   if (RequiresDataSharing && threadId % WARPSIZE == 0) {
     // Warp master innitializes data sharing environment.
     unsigned WID = threadId / WARPSIZE;
-    __kmpc_data_sharing_slot *RootS = currTeamDescr.RootS(WID);
+    __kmpc_data_sharing_slot *RootS = currTeamDescr.RootS(
+        WID, WID == WARPSIZE - 1);
     DataSharingState.SlotPtr[WID] = RootS;
     DataSharingState.StackPtr[WID] = (void *)&RootS->Data[0];
   }
Index: libomptarget/deviceRTLs/nvptx/src/data_sharing.cu
===================================================================
--- libomptarget/deviceRTLs/nvptx/src/data_sharing.cu
+++ libomptarget/deviceRTLs/nvptx/src/data_sharing.cu
@@ -88,7 +88,7 @@
 
   omptarget_nvptx_TeamDescr *teamDescr =
       &omptarget_nvptx_threadPrivateContext->TeamContext();
-  __kmpc_data_sharing_slot *RootS = teamDescr->RootS(WID);
+  __kmpc_data_sharing_slot *RootS = teamDescr->RootS(WID, IsMasterThread());
 
   DataSharingState.SlotPtr[WID] = RootS;
   DataSharingState.StackPtr[WID] = (void *)&RootS->Data[0];
@@ -337,17 +337,27 @@
   // This function initializes the stack pointer with the pointer to the
   // statically allocated shared memory slots. The size of a shared memory
   // slot is pre-determined to be 256 bytes.
-  unsigned WID = getWarpId();
-  omptarget_nvptx_TeamDescr *teamDescr =
-      &omptarget_nvptx_threadPrivateContext->TeamContext();
-  __kmpc_data_sharing_slot *RootS = teamDescr->RootS(WID);
 
-  DataSharingState.SlotPtr[WID] = RootS;
-  DataSharingState.TailPtr[WID] = RootS;
-  DataSharingState.StackPtr[WID] = (void *)&RootS->Data[0];
+  // Initialize the data sharing structures. This section should only be
+  // executed by the warp active master threads.
+  if (IsWarpMasterActiveThread()) {
+    unsigned WID = getWarpId();
+    omptarget_nvptx_TeamDescr *teamDescr =
+        &omptarget_nvptx_threadPrivateContext->TeamContext();
+    __kmpc_data_sharing_slot *RootS = teamDescr->RootS(WID, IsMasterThread());
 
-  // We initialize the list of references to arguments here.
-  omptarget_nvptx_globalArgs.Init();
+    DataSharingState.SlotPtr[WID] = RootS;
+    DataSharingState.TailPtr[WID] = RootS;
+    DataSharingState.StackPtr[WID] = (void *)&RootS->Data[0];
+  }
+
+  // We currently only support the sharing of variables between master and
+  // workers. The list of references to shared variables exists only for
+  // the master thread.
+  if (IsMasterThread()) {
+    // We initialize the list of references to arguments here.
+    omptarget_nvptx_globalArgs.Init();
+  }
 }
 
 // Called at the time of the kernel initialization. This is used to initilize


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D44537.138617.patch
Type: text/x-patch
Size: 3695 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/openmp-commits/attachments/20180315/bc0bcdd7/attachment.bin>


More information about the Openmp-commits mailing list