diff options
author | Alexey Bataev <a.bataev@hotmail.com> | 2019-05-02 20:05:01 +0000 |
---|---|---|
committer | Alexey Bataev <a.bataev@hotmail.com> | 2019-05-02 20:05:01 +0000 |
commit | 2d4c5f915a723961181c1725daa66a299ab65e81 (patch) | |
tree | 5f32eaf163ca0b3e99adac63e7653142bfa1856b /libomptarget/deviceRTLs/nvptx/src/libcall.cu | |
parent | db75b85d572b5526020f54055f37fc6bba22e08b (diff) |
[OPENMP][NVPTX]Improve code by using parallel level counter.
Summary:
Previously for the different purposes we need to get the active/common
parallel level and with full runtime we iterated over all the records to
calculate this level. Instead, we can used the warp-based parallel level
counters used in no-runtime mode.
Reviewers: grokos, gtbercea, kkwli0
Subscribers: guansong, jfb, jdoerfert, caomhin, openmp-commits
Tags: #openmp
Differential Revision: https://reviews.llvm.org/D61395
git-svn-id: https://llvm.org/svn/llvm-project/openmp/trunk@359822 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'libomptarget/deviceRTLs/nvptx/src/libcall.cu')
-rw-r--r-- | libomptarget/deviceRTLs/nvptx/src/libcall.cu | 55 |
1 files changed, 5 insertions, 50 deletions
diff --git a/libomptarget/deviceRTLs/nvptx/src/libcall.cu b/libomptarget/deviceRTLs/nvptx/src/libcall.cu index 26b0f4e..452463c 100644 --- a/libomptarget/deviceRTLs/nvptx/src/libcall.cu +++ b/libomptarget/deviceRTLs/nvptx/src/libcall.cu @@ -47,8 +47,7 @@ EXTERN void omp_set_num_threads(int num) { EXTERN int omp_get_num_threads(void) { bool isSPMDExecutionMode = isSPMDMode(); int tid = GetLogicalThreadIdInBlock(isSPMDExecutionMode); - int rc = - GetNumberOfOmpThreads(tid, isSPMDExecutionMode, isRuntimeUninitialized()); + int rc = GetNumberOfOmpThreads(tid, isSPMDExecutionMode); PRINT(LD_IO, "call omp_get_num_threads() return %d\n", rc); return rc; } @@ -83,7 +82,7 @@ EXTERN int omp_get_thread_limit(void) { EXTERN int omp_get_thread_num() { bool isSPMDExecutionMode = isSPMDMode(); int tid = GetLogicalThreadIdInBlock(isSPMDExecutionMode); - int rc = GetOmpThreadId(tid, isSPMDExecutionMode, isRuntimeUninitialized()); + int rc = GetOmpThreadId(tid, isSPMDExecutionMode); PRINT(LD_IO, "call omp_get_thread_num() returns %d\n", rc); return rc; } @@ -95,18 +94,7 @@ EXTERN int omp_get_num_procs(void) { } EXTERN int omp_in_parallel(void) { - int rc = 0; - if (isRuntimeUninitialized()) { - ASSERT0(LT_FUSSY, isSPMDMode(), - "Expected SPMD mode only with uninitialized runtime."); - rc = 1; // SPMD mode is always in parallel. - } else { - omptarget_nvptx_TaskDescr *currTaskDescr = - getMyTopTaskDescriptor(isSPMDMode()); - if (currTaskDescr->InParallelRegion()) { - rc = 1; - } - } + int rc = parallelLevel[GetWarpId()] > OMP_ACTIVE_PARALLEL_LEVEL ? 1 : 0; PRINT(LD_IO, "call omp_in_parallel() returns %d\n", rc); return rc; } @@ -155,46 +143,13 @@ EXTERN int omp_get_max_active_levels(void) { } EXTERN int omp_get_level(void) { - if (isRuntimeUninitialized()) { - ASSERT0(LT_FUSSY, isSPMDMode(), - "Expected SPMD mode only with uninitialized runtime."); - // parallelLevel starts from 0, need to add 1 for correct level. - return parallelLevel[GetWarpId()] + 1; - } - int level = 0; - omptarget_nvptx_TaskDescr *currTaskDescr = - getMyTopTaskDescriptor(isSPMDMode()); - ASSERT0(LT_FUSSY, currTaskDescr, - "do not expect fct to be called in a non-active thread"); - do { - if (currTaskDescr->IsParallelConstruct()) { - level++; - } - currTaskDescr = currTaskDescr->GetPrevTaskDescr(); - } while (currTaskDescr); + int level = parallelLevel[GetWarpId()] & (OMP_ACTIVE_PARALLEL_LEVEL - 1); PRINT(LD_IO, "call omp_get_level() returns %d\n", level); return level; } EXTERN int omp_get_active_level(void) { - if (isRuntimeUninitialized()) { - ASSERT0(LT_FUSSY, isSPMDMode(), - "Expected SPMD mode only with uninitialized runtime."); - return 1; - } - int level = 0; // no active level parallelism - omptarget_nvptx_TaskDescr *currTaskDescr = - getMyTopTaskDescriptor(isSPMDMode()); - ASSERT0(LT_FUSSY, currTaskDescr, - "do not expect fct to be called in a non-active thread"); - do { - if (currTaskDescr->ThreadsInTeam() > 1) { - // has a parallel with more than one thread in team - level = 1; - break; - } - currTaskDescr = currTaskDescr->GetPrevTaskDescr(); - } while (currTaskDescr); + int level = parallelLevel[GetWarpId()] > OMP_ACTIVE_PARALLEL_LEVEL ? 1 : 0; PRINT(LD_IO, "call omp_get_active_level() returns %d\n", level) return level; } |