[Openmp-commits] [openmp] r327040 - [OpenMP][libomptarget] Fix union.
Gheorghe-Teodor Bercea via Openmp-commits
openmp-commits at lists.llvm.org
Thu Mar 8 10:44:02 PST 2018
Author: gbercea
Date: Thu Mar 8 10:44:02 2018
New Revision: 327040
URL: http://llvm.org/viewvc/llvm-project?rev=327040&view=rev
Log:
[OpenMP][libomptarget] Fix union.
Summary: To make the two parts of the union have the same size, the size of vect needs to be increased by 16 bits.
Reviewers: grokos, carlo.bertolli, caomhin, ABataev
Reviewed By: grokos, ABataev
Subscribers: fedor.sergeev, guansong, openmp-commits
Differential Revision: https://reviews.llvm.org/D44254
Modified:
openmp/trunk/libomptarget/deviceRTLs/nvptx/src/omptarget-nvptx.h
openmp/trunk/libomptarget/deviceRTLs/nvptx/src/omptarget-nvptxi.h
Modified: openmp/trunk/libomptarget/deviceRTLs/nvptx/src/omptarget-nvptx.h
URL: http://llvm.org/viewvc/llvm-project/openmp/trunk/libomptarget/deviceRTLs/nvptx/src/omptarget-nvptx.h?rev=327040&r1=327039&r2=327040&view=diff
==============================================================================
--- openmp/trunk/libomptarget/deviceRTLs/nvptx/src/omptarget-nvptx.h (original)
+++ openmp/trunk/libomptarget/deviceRTLs/nvptx/src/omptarget-nvptx.h Thu Mar 8 10:44:02 2018
@@ -107,27 +107,27 @@ public:
// methods for flags
INLINE omp_sched_t GetRuntimeSched();
INLINE void SetRuntimeSched(omp_sched_t sched);
- INLINE int IsDynamic() { return data.items.flags & TaskDescr_IsDynamic; }
+ INLINE int IsDynamic() { return items.flags & TaskDescr_IsDynamic; }
INLINE void SetDynamic() {
- data.items.flags = data.items.flags | TaskDescr_IsDynamic;
+ items.flags = items.flags | TaskDescr_IsDynamic;
}
INLINE void ClearDynamic() {
- data.items.flags = data.items.flags & (~TaskDescr_IsDynamic);
+ items.flags = items.flags & (~TaskDescr_IsDynamic);
}
- INLINE int InParallelRegion() { return data.items.flags & TaskDescr_InPar; }
+ INLINE int InParallelRegion() { return items.flags & TaskDescr_InPar; }
INLINE int InL2OrHigherParallelRegion() {
- return data.items.flags & TaskDescr_InParL2P;
+ return items.flags & TaskDescr_InParL2P;
}
INLINE int IsParallelConstruct() {
- return data.items.flags & TaskDescr_IsParConstr;
+ return items.flags & TaskDescr_IsParConstr;
}
INLINE int IsTaskConstruct() { return !IsParallelConstruct(); }
// methods for other fields
- INLINE uint16_t &NThreads() { return data.items.nthreads; }
- INLINE uint16_t &ThreadLimit() { return data.items.threadlimit; }
- INLINE uint16_t &ThreadId() { return data.items.threadId; }
- INLINE uint16_t &ThreadsInTeam() { return data.items.threadsInTeam; }
- INLINE uint64_t &RuntimeChunkSize() { return data.items.runtimeChunkSize; }
+ INLINE uint16_t &NThreads() { return items.nthreads; }
+ INLINE uint16_t &ThreadLimit() { return items.threadlimit; }
+ INLINE uint16_t &ThreadId() { return items.threadId; }
+ INLINE uint16_t &ThreadsInTeam() { return items.threadsInTeam; }
+ INLINE uint64_t &RuntimeChunkSize() { return items.runtimeChunkSize; }
INLINE omptarget_nvptx_TaskDescr *GetPrevTaskDescr() { return prev; }
INLINE void SetPrevTaskDescr(omptarget_nvptx_TaskDescr *taskDescr) {
prev = taskDescr;
@@ -160,18 +160,15 @@ private:
static const uint8_t TaskDescr_IsParConstr = 0x20;
static const uint8_t TaskDescr_InParL2P = 0x40;
- union { // both have same size
- uint64_t vect[2];
- struct TaskDescr_items {
- uint8_t flags; // 6 bit used (see flag above)
- uint8_t unused;
- uint16_t nthreads; // thread num for subsequent parallel regions
- uint16_t threadlimit; // thread limit ICV
- uint16_t threadId; // thread id
- uint16_t threadsInTeam; // threads in current team
- uint64_t runtimeChunkSize; // runtime chunk size
- } items;
- } data;
+ struct TaskDescr_items {
+ uint8_t flags; // 6 bit used (see flag above)
+ uint8_t unused;
+ uint16_t nthreads; // thread num for subsequent parallel regions
+ uint16_t threadlimit; // thread limit ICV
+ uint16_t threadId; // thread id
+ uint16_t threadsInTeam; // threads in current team
+ uint64_t runtimeChunkSize; // runtime chunk size
+ } items;
omptarget_nvptx_TaskDescr *prev;
};
Modified: openmp/trunk/libomptarget/deviceRTLs/nvptx/src/omptarget-nvptxi.h
URL: http://llvm.org/viewvc/llvm-project/openmp/trunk/libomptarget/deviceRTLs/nvptx/src/omptarget-nvptxi.h?rev=327040&r1=327039&r2=327040&view=diff
==============================================================================
--- openmp/trunk/libomptarget/deviceRTLs/nvptx/src/omptarget-nvptxi.h (original)
+++ openmp/trunk/libomptarget/deviceRTLs/nvptx/src/omptarget-nvptxi.h Thu Mar 8 10:44:02 2018
@@ -18,7 +18,7 @@
INLINE omp_sched_t omptarget_nvptx_TaskDescr::GetRuntimeSched() {
// sched starts from 1..4; encode it as 0..3; so add 1 here
- uint8_t rc = (data.items.flags & TaskDescr_SchedMask) + 1;
+ uint8_t rc = (items.flags & TaskDescr_SchedMask) + 1;
return (omp_sched_t)rc;
}
@@ -26,9 +26,9 @@ INLINE void omptarget_nvptx_TaskDescr::S
// sched starts from 1..4; encode it as 0..3; so sub 1 here
uint8_t val = ((uint8_t)sched) - 1;
// clear current sched
- data.items.flags &= ~TaskDescr_SchedMask;
+ items.flags &= ~TaskDescr_SchedMask;
// set new sched
- data.items.flags |= val;
+ items.flags |= val;
}
INLINE void omptarget_nvptx_TaskDescr::InitLevelZeroTaskDescr() {
@@ -38,12 +38,12 @@ INLINE void omptarget_nvptx_TaskDescr::I
// dyn is off (unused now anyway, but may need to sample from host ?)
// not in parallel
- data.items.flags = 0;
- data.items.nthreads = GetNumberOfProcsInTeam();
+ items.flags = 0;
+ items.nthreads = GetNumberOfProcsInTeam();
; // threads: whatever was alloc by kernel
- data.items.threadId = 0; // is master
- data.items.threadsInTeam = 1; // sequential
- data.items.runtimeChunkSize = 1; // prefered chunking statik with chunk 1
+ items.threadId = 0; // is master
+ items.threadsInTeam = 1; // sequential
+ items.runtimeChunkSize = 1; // prefered chunking statik with chunk 1
}
// This is called when all threads are started together in SPMD mode.
@@ -56,20 +56,19 @@ INLINE void omptarget_nvptx_TaskDescr::I
// dyn is off (unused now anyway, but may need to sample from host ?)
// in L1 parallel
- data.items.flags =
+ items.flags =
TaskDescr_InPar | TaskDescr_IsParConstr; // set flag to parallel
- data.items.nthreads = 0; // # threads for subsequent parallel region
- data.items.threadId =
+ items.nthreads = 0; // # threads for subsequent parallel region
+ items.threadId =
GetThreadIdInBlock(); // get ids from cuda (only called for 1st level)
- data.items.threadsInTeam = tnum;
- data.items.runtimeChunkSize = 1; // prefered chunking statik with chunk 1
+ items.threadsInTeam = tnum;
+ items.runtimeChunkSize = 1; // prefered chunking statik with chunk 1
prev = parentTaskDescr;
}
INLINE void omptarget_nvptx_TaskDescr::CopyData(
omptarget_nvptx_TaskDescr *sourceTaskDescr) {
- data.vect[0] = sourceTaskDescr->data.vect[0];
- data.vect[1] = sourceTaskDescr->data.vect[1];
+ items = sourceTaskDescr->items;
}
INLINE void
@@ -87,7 +86,7 @@ INLINE void omptarget_nvptx_TaskDescr::C
INLINE void omptarget_nvptx_TaskDescr::CopyForExplicitTask(
omptarget_nvptx_TaskDescr *parentTaskDescr) {
CopyParent(parentTaskDescr);
- data.items.flags = data.items.flags & ~TaskDescr_IsParConstr;
+ items.flags = items.flags & ~TaskDescr_IsParConstr;
ASSERT0(LT_FUSSY, IsTaskConstruct(), "expected task");
}
@@ -95,9 +94,9 @@ INLINE void omptarget_nvptx_TaskDescr::C
omptarget_nvptx_TaskDescr *masterTaskDescr, uint16_t tnum) {
CopyParent(masterTaskDescr);
// overrwrite specific items;
- data.items.flags |=
+ items.flags |=
TaskDescr_InPar | TaskDescr_IsParConstr; // set flag to parallel
- data.items.threadsInTeam = tnum; // set number of threads
+ items.threadsInTeam = tnum; // set number of threads
}
INLINE void omptarget_nvptx_TaskDescr::CopyFromWorkDescr(
@@ -114,16 +113,16 @@ INLINE void omptarget_nvptx_TaskDescr::C
// never enters this region. When a parallel region is executed serially,
// the threadId is set to 0 elsewhere and the kmpc_serialized_* functions
// are called, which never activate this region.
- data.items.threadId =
+ items.threadId =
GetThreadIdInBlock(); // get ids from cuda (only called for 1st level)
}
INLINE void omptarget_nvptx_TaskDescr::CopyConvergentParent(
omptarget_nvptx_TaskDescr *parentTaskDescr, uint16_t tid, uint16_t tnum) {
CopyParent(parentTaskDescr);
- data.items.flags |= TaskDescr_InParL2P; // In L2+ parallelism
- data.items.threadsInTeam = tnum; // set number of threads
- data.items.threadId = tid;
+ items.flags |= TaskDescr_InParL2P; // In L2+ parallelism
+ items.threadsInTeam = tnum; // set number of threads
+ items.threadId = tid;
}
////////////////////////////////////////////////////////////////////////////////
More information about the Openmp-commits
mailing list