aboutsummaryrefslogtreecommitdiff
path: root/libomptarget/deviceRTLs/nvptx/src/libcall.cu
diff options
context:
space:
mode:
authorAlexey Bataev <a.bataev@hotmail.com>2019-05-03 14:47:20 +0000
committerAlexey Bataev <a.bataev@hotmail.com>2019-05-03 14:47:20 +0000
commit49325fc6abe74ff4a67ef19409999d128d17dca6 (patch)
treea609edaa7dcd9d697ef9be6ee217cb8efa19ee78 /libomptarget/deviceRTLs/nvptx/src/libcall.cu
parent2d4c5f915a723961181c1725daa66a299ab65e81 (diff)
[OPENMP][NVPTX]Improved several standard OpenMP functions, NFC.
Summary: Used parallelLevel[] counter to simplify and improve implementation of the existing standard OpenMP functions. Functions are tested already in several tests, the patch is NFC. Reviewers: grokos, gtbercea, kkwli0 Subscribers: guansong, jdoerfert, caomhin, openmp-commits Tags: #openmp Differential Revision: https://reviews.llvm.org/D61459 git-svn-id: https://llvm.org/svn/llvm-project/openmp/trunk@359892 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'libomptarget/deviceRTLs/nvptx/src/libcall.cu')
-rw-r--r--libomptarget/deviceRTLs/nvptx/src/libcall.cu39
1 files changed, 19 insertions, 20 deletions
diff --git a/libomptarget/deviceRTLs/nvptx/src/libcall.cu b/libomptarget/deviceRTLs/nvptx/src/libcall.cu
index 452463c..681b819 100644
--- a/libomptarget/deviceRTLs/nvptx/src/libcall.cu
+++ b/libomptarget/deviceRTLs/nvptx/src/libcall.cu
@@ -53,17 +53,16 @@ EXTERN int omp_get_num_threads(void) {
}
EXTERN int omp_get_max_threads(void) {
- if (isSPMDMode())
+ if (parallelLevel[GetWarpId()] > 0)
// We're already in parallel region.
- return 1; // default is 1 thread avail
+ return 1; // default is 1 thread avail
omptarget_nvptx_TaskDescr *currTaskDescr =
getMyTopTaskDescriptor(/*isSPMDExecutionMode=*/false);
- int rc = 1; // default is 1 thread avail
- if (!currTaskDescr->InParallelRegion()) {
- // Not currently in a parallel region, return what was set.
- rc = currTaskDescr->NThreads();
- ASSERT0(LT_FUSSY, rc >= 0, "bad number of threads");
- }
+ ASSERT0(LT_FUSSY, !currTaskDescr->InParallelRegion(),
+ "Should no be in the parallel region");
+ // Not currently in a parallel region, return what was set.
+ int rc = currTaskDescr->NThreads();
+ ASSERT0(LT_FUSSY, rc >= 0, "bad number of threads");
PRINT(LD_IO, "call omp_get_max_threads() return %d\n", rc);
return rc;
}
@@ -155,19 +154,19 @@ EXTERN int omp_get_active_level(void) {
}
EXTERN int omp_get_ancestor_thread_num(int level) {
- if (isRuntimeUninitialized()) {
- ASSERT0(LT_FUSSY, isSPMDMode(),
- "Expected SPMD mode only with uninitialized runtime.");
+ if (isSPMDMode())
return level == 1 ? GetThreadIdInBlock() : 0;
- }
int rc = -1;
- if (level == 0) {
+ // If level is 0 or all parallel regions are not active - return 0.
+ unsigned parLevel = parallelLevel[GetWarpId()];
+ if (level == 0 || (level > 0 && parLevel < OMP_ACTIVE_PARALLEL_LEVEL &&
+ level <= parLevel)) {
rc = 0;
} else if (level > 0) {
int totLevel = omp_get_level();
if (level <= totLevel) {
omptarget_nvptx_TaskDescr *currTaskDescr =
- getMyTopTaskDescriptor(isSPMDMode());
+ getMyTopTaskDescriptor(/*isSPMDExecutionMode=*/false);
int steps = totLevel - level;
PRINT(LD_IO, "backtrack %d steps\n", steps);
ASSERT0(LT_FUSSY, currTaskDescr,
@@ -207,19 +206,19 @@ EXTERN int omp_get_ancestor_thread_num(int level) {
}
EXTERN int omp_get_team_size(int level) {
- if (isRuntimeUninitialized()) {
- ASSERT0(LT_FUSSY, isSPMDMode(),
- "Expected SPMD mode only with uninitialized runtime.");
+ if (isSPMDMode())
return level == 1 ? GetNumberOfThreadsInBlock() : 1;
- }
int rc = -1;
- if (level == 0) {
+ unsigned parLevel = parallelLevel[GetWarpId()];
+ // If level is 0 or all parallel regions are not active - return 1.
+ if (level == 0 || (level > 0 && parLevel < OMP_ACTIVE_PARALLEL_LEVEL &&
+ level <= parLevel)) {
rc = 1;
} else if (level > 0) {
int totLevel = omp_get_level();
if (level <= totLevel) {
omptarget_nvptx_TaskDescr *currTaskDescr =
- getMyTopTaskDescriptor(isSPMDMode());
+ getMyTopTaskDescriptor(/*isSPMDExecutionMode=*/false);
int steps = totLevel - level;
ASSERT0(LT_FUSSY, currTaskDescr,
"do not expect fct to be called in a non-active thread");