diff options
author | Alexey Bataev <a.bataev@hotmail.com> | 2018-11-20 20:19:36 +0000 |
---|---|---|
committer | Alexey Bataev <a.bataev@hotmail.com> | 2018-11-20 20:19:36 +0000 |
commit | 3de4398f5b5f60391fa1a4cc20f4959dd21b188a (patch) | |
tree | 8dedab73625db439e798e5f28ca4fdbc9f17d870 /libomptarget/deviceRTLs | |
parent | 69e4da403e6514ba80a2ed85a323c6d94a11d853 (diff) |
[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
git-svn-id: https://llvm.org/svn/llvm-project/openmp/trunk@347342 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'libomptarget/deviceRTLs')
-rw-r--r-- | libomptarget/deviceRTLs/nvptx/src/critical.cu | 16 | ||||
-rw-r--r-- | libomptarget/deviceRTLs/nvptx/src/libcall.cu | 17 | ||||
-rw-r--r-- | libomptarget/deviceRTLs/nvptx/src/omptarget-nvptx.h | 2 |
3 files changed, 11 insertions, 24 deletions
diff --git a/libomptarget/deviceRTLs/nvptx/src/critical.cu b/libomptarget/deviceRTLs/nvptx/src/critical.cu index fef8101..2b92b9a 100644 --- a/libomptarget/deviceRTLs/nvptx/src/critical.cu +++ b/libomptarget/deviceRTLs/nvptx/src/critical.cu @@ -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); } diff --git a/libomptarget/deviceRTLs/nvptx/src/libcall.cu b/libomptarget/deviceRTLs/nvptx/src/libcall.cu index ea9225d..3e8f248 100644 --- a/libomptarget/deviceRTLs/nvptx/src/libcall.cu +++ b/libomptarget/deviceRTLs/nvptx/src/libcall.cu @@ -404,23 +404,21 @@ EXTERN int omp_get_max_task_priority(void) { #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 *lock) { } 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 *lock) { 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); diff --git a/libomptarget/deviceRTLs/nvptx/src/omptarget-nvptx.h b/libomptarget/deviceRTLs/nvptx/src/omptarget-nvptx.h index 2a6de28..b63feae 100644 --- a/libomptarget/deviceRTLs/nvptx/src/omptarget-nvptx.h +++ b/libomptarget/deviceRTLs/nvptx/src/omptarget-nvptx.h @@ -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) |