diff options
author | Alexey Bataev <a.bataev@hotmail.com> | 2018-08-29 17:35:09 +0000 |
---|---|---|
committer | Alexey Bataev <a.bataev@hotmail.com> | 2018-08-29 17:35:09 +0000 |
commit | 4ae92ac4ef3db2921638a824d9f0ee220732da64 (patch) | |
tree | a1a41ab059b10df6f04066e16306baf2a8a4dd3d /libomptarget/deviceRTLs/nvptx/src/libcall.cu | |
parent | 3e1e7c423b7b2dfb4fc047db18192d3ba48244be (diff) |
[OPENMP][NVPTX] Lightweight runtime support for SPMD mode.
Summary:
Implemented simple and lightweight runtime support for SPMD mode-based
constructs. It adds support for L2 sequential parallelism wihtout full
runtime support. Also, patch fixes some use cases for
uninitialized|lightweight runtime.
Reviewers: grokos, kkwli0, Hahnfeld, gtbercea
Subscribers: guansong, openmp-commits
Differential Revision: https://reviews.llvm.org/D51222
git-svn-id: https://llvm.org/svn/llvm-project/openmp/trunk@340944 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'libomptarget/deviceRTLs/nvptx/src/libcall.cu')
-rw-r--r-- | libomptarget/deviceRTLs/nvptx/src/libcall.cu | 75 |
1 files changed, 69 insertions, 6 deletions
diff --git a/libomptarget/deviceRTLs/nvptx/src/libcall.cu b/libomptarget/deviceRTLs/nvptx/src/libcall.cu index 15040db..de493a5 100644 --- a/libomptarget/deviceRTLs/nvptx/src/libcall.cu +++ b/libomptarget/deviceRTLs/nvptx/src/libcall.cu @@ -31,6 +31,10 @@ EXTERN double omp_get_wtime(void) { } EXTERN void omp_set_num_threads(int num) { + // Ignore it for SPMD mode. + if (isSPMDMode()) + return; + assert(isRuntimeInitialized() && "Expected initialized runtime."); PRINT(LD_IO, "call omp_set_num_threads(num %d)\n", num); if (num <= 0) { WARNING0(LW_INPUT, "expected positive num; ignore\n"); @@ -48,6 +52,12 @@ EXTERN int omp_get_num_threads(void) { } EXTERN int omp_get_max_threads(void) { + if (isRuntimeUninitialized()) { + assert(isSPMDMode() && + "expected SPMD mode only with uninitialized runtime."); + // We're already in parallel region. + return 1; // default is 1 thread avail + } omptarget_nvptx_TaskDescr *currTaskDescr = getMyTopTaskDescriptor(); int rc = 1; // default is 1 thread avail if (!currTaskDescr->InParallelRegion()) { @@ -60,6 +70,11 @@ EXTERN int omp_get_max_threads(void) { } EXTERN int omp_get_thread_limit(void) { + if (isRuntimeUninitialized()) { + assert(isSPMDMode() && + "expected SPMD mode only with uninitialized runtime."); + return 0; // default is 0 + } // per contention group.. meaning threads in current team omptarget_nvptx_TaskDescr *currTaskDescr = getMyTopTaskDescriptor(); int rc = currTaskDescr->ThreadLimit(); @@ -82,9 +97,15 @@ EXTERN int omp_get_num_procs(void) { EXTERN int omp_in_parallel(void) { int rc = 0; - omptarget_nvptx_TaskDescr *currTaskDescr = getMyTopTaskDescriptor(); - if (currTaskDescr->InParallelRegion()) { - rc = 1; + if (isRuntimeUninitialized()) { + assert(isSPMDMode() && + "expected SPMD mode only with uninitialized runtime."); + rc = 1; // SPMD mode is always in parallel. + } else { + omptarget_nvptx_TaskDescr *currTaskDescr = getMyTopTaskDescriptor(); + if (currTaskDescr->InParallelRegion()) { + rc = 1; + } } PRINT(LD_IO, "call omp_in_parallel() returns %d\n", rc); return rc; @@ -102,6 +123,11 @@ EXTERN int omp_in_final(void) { EXTERN void omp_set_dynamic(int flag) { PRINT(LD_IO, "call omp_set_dynamic(%d)\n", flag); + if (isRuntimeUninitialized()) { + assert(isSPMDMode() && + "expected SPMD mode only with uninitialized runtime."); + return; + } omptarget_nvptx_TaskDescr *currTaskDescr = getMyTopTaskDescriptor(); if (flag) { @@ -113,6 +139,11 @@ EXTERN void omp_set_dynamic(int flag) { EXTERN int omp_get_dynamic(void) { int rc = 0; + if (isRuntimeUninitialized()) { + assert(isSPMDMode() && + "expected SPMD mode only with uninitialized runtime."); + return rc; + } omptarget_nvptx_TaskDescr *currTaskDescr = getMyTopTaskDescriptor(); if (currTaskDescr->IsDynamic()) { rc = 1; @@ -145,6 +176,11 @@ EXTERN int omp_get_max_active_levels(void) { } EXTERN int omp_get_level(void) { + if (isRuntimeUninitialized()) { + assert(isSPMDMode() && + "expected SPMD mode only with uninitialized runtime."); + return omptarget_nvptx_simpleThreadPrivateContext->GetParallelLevel(); + } int level = 0; omptarget_nvptx_TaskDescr *currTaskDescr = getMyTopTaskDescriptor(); ASSERT0(LT_FUSSY, currTaskDescr, @@ -160,6 +196,11 @@ EXTERN int omp_get_level(void) { } EXTERN int omp_get_active_level(void) { + if (isRuntimeUninitialized()) { + assert(isSPMDMode() && + "expected SPMD mode only with uninitialized runtime."); + return 1; + } int level = 0; // no active level parallelism omptarget_nvptx_TaskDescr *currTaskDescr = getMyTopTaskDescriptor(); ASSERT0(LT_FUSSY, currTaskDescr, @@ -177,6 +218,11 @@ EXTERN int omp_get_active_level(void) { } EXTERN int omp_get_ancestor_thread_num(int level) { + if (isRuntimeUninitialized()) { + assert(isSPMDMode() && + "expected SPMD mode only with uninitialized runtime."); + return level == 1 ? GetThreadIdInBlock() : 0; + } int rc = 0; // default at level 0 if (level >= 0) { int totLevel = omp_get_level(); @@ -220,6 +266,11 @@ EXTERN int omp_get_ancestor_thread_num(int level) { } EXTERN int omp_get_team_size(int level) { + if (isRuntimeUninitialized()) { + assert(isSPMDMode() && + "expected SPMD mode only with uninitialized runtime."); + return level == 1 ? GetNumberOfThreadsInBlock() : 1; + } int rc = 1; // default at level 0 if (level >= 0) { int totLevel = omp_get_level(); @@ -247,9 +298,16 @@ EXTERN int omp_get_team_size(int level) { } EXTERN void omp_get_schedule(omp_sched_t *kind, int *modifier) { - omptarget_nvptx_TaskDescr *currTaskDescr = getMyTopTaskDescriptor(); - *kind = currTaskDescr->GetRuntimeSched(); - *modifier = currTaskDescr->RuntimeChunkSize(); + if (isRuntimeUninitialized()) { + assert(isSPMDMode() && + "expected SPMD mode only with uninitialized runtime."); + *kind = omp_sched_static; + *modifier = 1; + } else { + omptarget_nvptx_TaskDescr *currTaskDescr = getMyTopTaskDescriptor(); + *kind = currTaskDescr->GetRuntimeSched(); + *modifier = currTaskDescr->RuntimeChunkSize(); + } PRINT(LD_IO, "call omp_get_schedule returns sched %d and modif %d\n", (int)*kind, *modifier); } @@ -257,6 +315,11 @@ EXTERN void omp_get_schedule(omp_sched_t *kind, int *modifier) { EXTERN void omp_set_schedule(omp_sched_t kind, int modifier) { PRINT(LD_IO, "call omp_set_schedule(sched %d, modif %d)\n", (int)kind, modifier); + if (isRuntimeUninitialized()) { + assert(isSPMDMode() && + "expected SPMD mode only with uninitialized runtime."); + return; + } if (kind >= omp_sched_static && kind < omp_sched_auto) { omptarget_nvptx_TaskDescr *currTaskDescr = getMyTopTaskDescriptor(); currTaskDescr->SetRuntimeSched(kind); |