aboutsummaryrefslogtreecommitdiff
path: root/libomptarget/deviceRTLs/nvptx/src/libcall.cu
diff options
context:
space:
mode:
authorAlexey Bataev <a.bataev@hotmail.com>2018-08-29 17:35:09 +0000
committerAlexey Bataev <a.bataev@hotmail.com>2018-08-29 17:35:09 +0000
commit4ae92ac4ef3db2921638a824d9f0ee220732da64 (patch)
treea1a41ab059b10df6f04066e16306baf2a8a4dd3d /libomptarget/deviceRTLs/nvptx/src/libcall.cu
parent3e1e7c423b7b2dfb4fc047db18192d3ba48244be (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.cu75
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);