From b4332ca3dab939f80456e1b47036d6c3b8caa017 Mon Sep 17 00:00:00 2001 From: Gheorghe-Teodor Bercea Date: Wed, 21 Mar 2018 20:51:16 +0000 Subject: [PATCH] [OpenMP][libomptarget] Fix master warp check Summary: The check for the master warp must take into consideration the actual number of warps: the master warp is equal to the last active warp not necessarily WARPSIZE - 1. Reviewers: grokos, carlo.bertolli, ABataev, caomhin Reviewed By: grokos Subscribers: guansong, openmp-commits Differential Revision: https://reviews.llvm.org/D44537 llvm-svn: 328146 --- .../deviceRTLs/nvptx/src/data_sharing.cu | 30 ++++++++++++++-------- .../deviceRTLs/nvptx/src/omptarget-nvptx.cu | 3 ++- .../deviceRTLs/nvptx/src/omptarget-nvptx.h | 4 +-- 3 files changed, 24 insertions(+), 13 deletions(-) diff --git a/openmp/libomptarget/deviceRTLs/nvptx/src/data_sharing.cu b/openmp/libomptarget/deviceRTLs/nvptx/src/data_sharing.cu index aa97c00..e0256d3 100644 --- a/openmp/libomptarget/deviceRTLs/nvptx/src/data_sharing.cu +++ b/openmp/libomptarget/deviceRTLs/nvptx/src/data_sharing.cu @@ -88,7 +88,7 @@ __kmpc_initialize_data_sharing_environment(__kmpc_data_sharing_slot *rootS, 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 @@ EXTERN void __kmpc_data_sharing_init_stack() { // 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]; + } + + // Currently we 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()) { + // Initialize the list of references to arguments. + omptarget_nvptx_globalArgs.Init(); + } } // Called at the time of the kernel initialization. This is used to initilize diff --git a/openmp/libomptarget/deviceRTLs/nvptx/src/omptarget-nvptx.cu b/openmp/libomptarget/deviceRTLs/nvptx/src/omptarget-nvptx.cu index 5c5c88b..4a861040 100644 --- a/openmp/libomptarget/deviceRTLs/nvptx/src/omptarget-nvptx.cu +++ b/openmp/libomptarget/deviceRTLs/nvptx/src/omptarget-nvptx.cu @@ -168,7 +168,8 @@ EXTERN void __kmpc_spmd_kernel_init(int ThreadLimit, int16_t RequiresOMPRuntime, 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]; } diff --git a/openmp/libomptarget/deviceRTLs/nvptx/src/omptarget-nvptx.h b/openmp/libomptarget/deviceRTLs/nvptx/src/omptarget-nvptx.h index 8f4f1cd..1902861 100644 --- a/openmp/libomptarget/deviceRTLs/nvptx/src/omptarget-nvptx.h +++ b/openmp/libomptarget/deviceRTLs/nvptx/src/omptarget-nvptx.h @@ -259,10 +259,10 @@ public: // 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; -- 2.7.4