[Openmp-commits] [openmp] r347342 - [OPENMP][NVPTX]Improved lock/critical constructs.
Alexey Bataev via Openmp-commits
openmp-commits at lists.llvm.org
Tue Nov 20 12:19:36 PST 2018
Author: abataev
Date: Tue Nov 20 12:19:36 2018
New Revision: 347342
URL: http://llvm.org/viewvc/llvm-project?rev=347342&view=rev
Log:
[OPENMP][NVPTX]Improved lock/critical constructs.
Summary: Improved support for critical constructs + omp_..._lock... constructs.
Reviewers: gtbercea, kkwli0, caomhin
Subscribers: guansong, jfb, openmp-commits
Differential Revision: https://reviews.llvm.org/D54766
Modified:
openmp/trunk/libomptarget/deviceRTLs/nvptx/src/critical.cu
openmp/trunk/libomptarget/deviceRTLs/nvptx/src/libcall.cu
openmp/trunk/libomptarget/deviceRTLs/nvptx/src/omptarget-nvptx.h
Modified: openmp/trunk/libomptarget/deviceRTLs/nvptx/src/critical.cu
URL: http://llvm.org/viewvc/llvm-project/openmp/trunk/libomptarget/deviceRTLs/nvptx/src/critical.cu?rev=347342&r1=347341&r2=347342&view=diff
==============================================================================
--- openmp/trunk/libomptarget/deviceRTLs/nvptx/src/critical.cu (original)
+++ openmp/trunk/libomptarget/deviceRTLs/nvptx/src/critical.cu Tue Nov 20 12:19:36 2018
@@ -15,18 +15,14 @@
#include "omptarget-nvptx.h"
-EXTERN
-void __kmpc_critical(kmp_Indent *loc, int32_t global_tid,
- kmp_CriticalName *lck) {
+EXTERN void __kmpc_critical(kmp_Indent *loc, int32_t global_tid,
+ kmp_CriticalName *lck) {
PRINT0(LD_IO, "call to kmpc_critical()\n");
- omptarget_nvptx_TeamDescr &teamDescr = getMyTeamDescriptor();
- omp_set_lock(teamDescr.CriticalLock());
+ omp_set_lock((omp_lock_t *)lck);
}
-EXTERN
-void __kmpc_end_critical(kmp_Indent *loc, int32_t global_tid,
- kmp_CriticalName *lck) {
+EXTERN void __kmpc_end_critical(kmp_Indent *loc, int32_t global_tid,
+ kmp_CriticalName *lck) {
PRINT0(LD_IO, "call to kmpc_end_critical()\n");
- omptarget_nvptx_TeamDescr &teamDescr = getMyTeamDescriptor();
- omp_unset_lock(teamDescr.CriticalLock());
+ omp_unset_lock((omp_lock_t *)lck);
}
Modified: openmp/trunk/libomptarget/deviceRTLs/nvptx/src/libcall.cu
URL: http://llvm.org/viewvc/llvm-project/openmp/trunk/libomptarget/deviceRTLs/nvptx/src/libcall.cu?rev=347342&r1=347341&r2=347342&view=diff
==============================================================================
--- openmp/trunk/libomptarget/deviceRTLs/nvptx/src/libcall.cu (original)
+++ openmp/trunk/libomptarget/deviceRTLs/nvptx/src/libcall.cu Tue Nov 20 12:19:36 2018
@@ -404,23 +404,21 @@ EXTERN int omp_get_max_task_priority(voi
#define SET 1
EXTERN void omp_init_lock(omp_lock_t *lock) {
- *lock = UNSET;
+ omp_unset_lock(lock);
PRINT0(LD_IO, "call omp_init_lock()\n");
}
EXTERN void omp_destroy_lock(omp_lock_t *lock) {
+ omp_unset_lock(lock);
PRINT0(LD_IO, "call omp_destroy_lock()\n");
}
EXTERN void omp_set_lock(omp_lock_t *lock) {
// int atomicCAS(int* address, int compare, int val);
// (old == compare ? val : old)
- int compare = UNSET;
- int val = SET;
// TODO: not sure spinning is a good idea here..
- while (atomicCAS(lock, compare, val) != UNSET) {
-
+ while (atomicCAS(lock, UNSET, SET) != UNSET) {
clock_t start = clock();
clock_t now;
for (;;) {
@@ -436,9 +434,7 @@ EXTERN void omp_set_lock(omp_lock_t *loc
}
EXTERN void omp_unset_lock(omp_lock_t *lock) {
- int compare = SET;
- int val = UNSET;
- int old = atomicCAS(lock, compare, val);
+ (void)atomicExch(lock, UNSET);
PRINT0(LD_IO, "call omp_unset_lock()\n");
}
@@ -446,10 +442,7 @@ EXTERN void omp_unset_lock(omp_lock_t *l
EXTERN int omp_test_lock(omp_lock_t *lock) {
// int atomicCAS(int* address, int compare, int val);
// (old == compare ? val : old)
- int compare = UNSET;
- int val = SET;
-
- int ret = atomicCAS(lock, compare, val);
+ int ret = atomicAdd(lock, 0);
PRINT(LD_IO, "call omp_test_lock() return %d\n", ret);
Modified: openmp/trunk/libomptarget/deviceRTLs/nvptx/src/omptarget-nvptx.h
URL: http://llvm.org/viewvc/llvm-project/openmp/trunk/libomptarget/deviceRTLs/nvptx/src/omptarget-nvptx.h?rev=347342&r1=347341&r2=347342&view=diff
==============================================================================
--- openmp/trunk/libomptarget/deviceRTLs/nvptx/src/omptarget-nvptx.h (original)
+++ openmp/trunk/libomptarget/deviceRTLs/nvptx/src/omptarget-nvptx.h Tue Nov 20 12:19:36 2018
@@ -251,7 +251,6 @@ public:
INLINE omptarget_nvptx_WorkDescr &WorkDescr() {
return workDescrForActiveParallel;
}
- INLINE omp_lock_t *CriticalLock() { return &criticalLock; }
INLINE uint64_t *getLastprivateIterBuffer() { return &lastprivateIterBuffer; }
// init
@@ -303,7 +302,6 @@ private:
levelZeroTaskDescr; // icv for team master initial thread
omptarget_nvptx_WorkDescr
workDescrForActiveParallel; // one, ONLY for the active par
- omp_lock_t criticalLock;
uint64_t lastprivateIterBuffer;
__align__(16)
More information about the Openmp-commits
mailing list