[Openmp-commits] [openmp] [OpenMP][NFC] Move more declarations out of private.h (PR #73823)
via Openmp-commits
openmp-commits at lists.llvm.org
Wed Nov 29 09:14:19 PST 2023
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-openmp
Author: Johannes Doerfert (jdoerfert)
<details>
<summary>Changes</summary>
---
Full diff: https://github.com/llvm/llvm-project/pull/73823.diff
5 Files Affected:
- (modified) openmp/libomptarget/include/OpenMP/InternalTypes.h (+46)
- (modified) openmp/libomptarget/include/OpenMP/omp.h (+12)
- (modified) openmp/libomptarget/include/omptarget.h (+68)
- (modified) openmp/libomptarget/src/api.cpp (+1)
- (modified) openmp/libomptarget/src/private.h (+1-116)
``````````diff
diff --git a/openmp/libomptarget/include/OpenMP/InternalTypes.h b/openmp/libomptarget/include/OpenMP/InternalTypes.h
index 861e382f964c7c9..fd5836e973aedf0 100644
--- a/openmp/libomptarget/include/OpenMP/InternalTypes.h
+++ b/openmp/libomptarget/include/OpenMP/InternalTypes.h
@@ -29,6 +29,52 @@ typedef struct kmp_depend_info {
} flags;
} kmp_depend_info_t;
+typedef struct kmp_tasking_flags { /* Total struct must be exactly 32 bits */
+ /* Compiler flags */ /* Total compiler flags must be 16 bits */
+ unsigned tiedness : 1; /* task is either tied (1) or untied (0) */
+ unsigned final : 1; /* task is final(1) so execute immediately */
+ unsigned merged_if0 : 1; /* no __kmpc_task_{begin/complete}_if0 calls in if0
+ code path */
+ unsigned destructors_thunk : 1; /* set if the compiler creates a thunk to
+ invoke destructors from the runtime */
+ unsigned proxy : 1; /* task is a proxy task (it will be executed outside the
+ context of the RTL) */
+ unsigned priority_specified : 1; /* set if the compiler provides priority
+ setting for the task */
+ unsigned detachable : 1; /* 1 == can detach */
+ unsigned hidden_helper : 1; /* 1 == hidden helper task */
+ unsigned reserved : 8; /* reserved for compiler use */
+
+ /* Library flags */ /* Total library flags must be 16 bits */
+ unsigned tasktype : 1; /* task is either explicit(1) or implicit (0) */
+ unsigned task_serial : 1; // task is executed immediately (1) or deferred (0)
+ unsigned tasking_ser : 1; // all tasks in team are either executed immediately
+ // (1) or may be deferred (0)
+ unsigned team_serial : 1; // entire team is serial (1) [1 thread] or parallel
+ // (0) [>= 2 threads]
+ /* If either team_serial or tasking_ser is set, task team may be NULL */
+ /* Task State Flags: */
+ unsigned started : 1; /* 1==started, 0==not started */
+ unsigned executing : 1; /* 1==executing, 0==not executing */
+ unsigned complete : 1; /* 1==complete, 0==not complete */
+ unsigned freed : 1; /* 1==freed, 0==allocated */
+ unsigned native : 1; /* 1==gcc-compiled task, 0==intel */
+ unsigned reserved31 : 7; /* reserved for library use */
+} kmp_tasking_flags_t;
+
+struct kmp_task;
+typedef int32_t (*kmp_routine_entry_t)(int32_t, struct kmp_task *);
+typedef struct kmp_task {
+ void *shareds;
+ kmp_routine_entry_t routine;
+ int32_t part_id;
+} kmp_task_t;
+
+int32_t __kmpc_global_thread_num(void *) __attribute__((weak));
+bool __kmpc_omp_has_task_team(int32_t gtid) __attribute__((weak));
+void **__kmpc_omp_get_target_async_handle_ptr(int32_t gtid)
+ __attribute__((weak));
+
} // extern "C"
#endif // OMPTARGET_OPENMP_INTERNAL_TYPES_H
diff --git a/openmp/libomptarget/include/OpenMP/omp.h b/openmp/libomptarget/include/OpenMP/omp.h
index c0896677328bb57..b44c6aff1b289cc 100644
--- a/openmp/libomptarget/include/OpenMP/omp.h
+++ b/openmp/libomptarget/include/OpenMP/omp.h
@@ -30,8 +30,20 @@
extern "C" {
+/// Type declarations
+///{
+
+typedef void *omp_depend_t;
+
+///}
+
+/// API declarations
+///{
+
int omp_get_default_device(void) __attribute__((weak));
+///}
+
/// InteropAPI
///
///{
diff --git a/openmp/libomptarget/include/omptarget.h b/openmp/libomptarget/include/omptarget.h
index d1c908e37f93ba2..34cee21f1607880 100644
--- a/openmp/libomptarget/include/omptarget.h
+++ b/openmp/libomptarget/include/omptarget.h
@@ -17,6 +17,8 @@
#include "Shared/Environment.h"
#include "Shared/SourceInfo.h"
+#include "OpenMP/InternalTypes.h"
+
#include <cstdint>
#include <deque>
#include <functional>
@@ -291,6 +293,72 @@ class AsyncInfoTy {
bool isQueueEmpty() const;
};
+// Wrapper for task stored async info objects.
+class TaskAsyncInfoWrapperTy {
+ // Invalid GTID as defined by libomp; keep in sync
+ static constexpr int KMP_GTID_DNE = -2;
+
+ const int ExecThreadID = KMP_GTID_DNE;
+ AsyncInfoTy LocalAsyncInfo;
+ AsyncInfoTy *AsyncInfo = &LocalAsyncInfo;
+ void **TaskAsyncInfoPtr = nullptr;
+
+public:
+ TaskAsyncInfoWrapperTy(DeviceTy &Device)
+ : ExecThreadID(__kmpc_global_thread_num(NULL)), LocalAsyncInfo(Device) {
+ // If we failed to acquired the current global thread id, we cannot
+ // re-enqueue the current task. Thus we should use the local blocking async
+ // info.
+ if (ExecThreadID == KMP_GTID_DNE)
+ return;
+
+ // Only tasks with an assigned task team can be re-enqueue and thus can
+ // use the non-blocking synchronization scheme. Thus we should use the local
+ // blocking async info, if we don´t have one.
+ if (!__kmpc_omp_has_task_team(ExecThreadID))
+ return;
+
+ // Acquire a pointer to the AsyncInfo stored inside the current task being
+ // executed.
+ TaskAsyncInfoPtr = __kmpc_omp_get_target_async_handle_ptr(ExecThreadID);
+
+ // If we cannot acquire such pointer, fallback to using the local blocking
+ // async info.
+ if (!TaskAsyncInfoPtr)
+ return;
+
+ // When creating a new task async info, the task handle must always be
+ // invalid. We must never overwrite any task async handle and there should
+ // never be any valid handle store inside the task at this point.
+ assert((*TaskAsyncInfoPtr) == nullptr &&
+ "Task async handle is not empty when dispatching new device "
+ "operations. The handle was not cleared properly or "
+ "__tgt_target_nowait_query should have been called!");
+
+ // If no valid async handle is present, a new AsyncInfo will be allocated
+ // and stored in the current task.
+ AsyncInfo = new AsyncInfoTy(Device, AsyncInfoTy::SyncTy::NON_BLOCKING);
+ *TaskAsyncInfoPtr = (void *)AsyncInfo;
+ }
+
+ ~TaskAsyncInfoWrapperTy() {
+ // Local async info destruction is automatically handled by ~AsyncInfoTy.
+ if (AsyncInfo == &LocalAsyncInfo)
+ return;
+
+ // If the are device operations still pending, return immediately without
+ // deallocating the handle.
+ if (!AsyncInfo->isDone())
+ return;
+
+ // Delete the handle and unset it from the OpenMP task data.
+ delete AsyncInfo;
+ *TaskAsyncInfoPtr = nullptr;
+ }
+
+ operator AsyncInfoTy &() { return *AsyncInfo; }
+};
+
/// This struct is a record of non-contiguous information
struct __tgt_target_non_contig {
uint64_t Offset;
diff --git a/openmp/libomptarget/src/api.cpp b/openmp/libomptarget/src/api.cpp
index e02ca4ada7349cd..42379f42d43ba0d 100644
--- a/openmp/libomptarget/src/api.cpp
+++ b/openmp/libomptarget/src/api.cpp
@@ -15,6 +15,7 @@
#include "private.h"
#include "rtl.h"
+#include "OpenMP/omp.h"
#include "Shared/Profile.h"
#include "llvm/ADT/SmallVector.h"
diff --git a/openmp/libomptarget/src/private.h b/openmp/libomptarget/src/private.h
index 1ead0212e9c48bb..fc01ca21e99b06e 100644
--- a/openmp/libomptarget/src/private.h
+++ b/openmp/libomptarget/src/private.h
@@ -105,58 +105,8 @@ typedef int (*TargetDataFuncPtrTy)(ident_t *, DeviceTy &, int32_t, void **,
#ifdef __cplusplus
extern "C" {
#endif
-/*!
- * The ident structure that describes a source location.
- * The struct is identical to the one in the kmp.h file.
- * We maintain the same data structure for compatibility.
- */
-typedef void *omp_depend_t;
-struct kmp_task;
-typedef int32_t (*kmp_routine_entry_t)(int32_t, struct kmp_task *);
-typedef struct kmp_task {
- void *shareds;
- kmp_routine_entry_t routine;
- int32_t part_id;
-} kmp_task_t;
-
-typedef struct kmp_tasking_flags { /* Total struct must be exactly 32 bits */
- /* Compiler flags */ /* Total compiler flags must be 16 bits */
- unsigned tiedness : 1; /* task is either tied (1) or untied (0) */
- unsigned final : 1; /* task is final(1) so execute immediately */
- unsigned merged_if0 : 1; /* no __kmpc_task_{begin/complete}_if0 calls in if0
- code path */
- unsigned destructors_thunk : 1; /* set if the compiler creates a thunk to
- invoke destructors from the runtime */
- unsigned proxy : 1; /* task is a proxy task (it will be executed outside the
- context of the RTL) */
- unsigned priority_specified : 1; /* set if the compiler provides priority
- setting for the task */
- unsigned detachable : 1; /* 1 == can detach */
- unsigned hidden_helper : 1; /* 1 == hidden helper task */
- unsigned reserved : 8; /* reserved for compiler use */
-
- /* Library flags */ /* Total library flags must be 16 bits */
- unsigned tasktype : 1; /* task is either explicit(1) or implicit (0) */
- unsigned task_serial : 1; // task is executed immediately (1) or deferred (0)
- unsigned tasking_ser : 1; // all tasks in team are either executed immediately
- // (1) or may be deferred (0)
- unsigned team_serial : 1; // entire team is serial (1) [1 thread] or parallel
- // (0) [>= 2 threads]
- /* If either team_serial or tasking_ser is set, task team may be NULL */
- /* Task State Flags: */
- unsigned started : 1; /* 1==started, 0==not started */
- unsigned executing : 1; /* 1==executing, 0==not executing */
- unsigned complete : 1; /* 1==complete, 0==not complete */
- unsigned freed : 1; /* 1==freed, 0==allocated */
- unsigned native : 1; /* 1==gcc-compiled task, 0==intel */
- unsigned reserved31 : 7; /* reserved for library use */
-} kmp_tasking_flags_t;
-
-int32_t __kmpc_global_thread_num(void *) __attribute__((weak));
+
int __kmpc_get_target_offload(void) __attribute__((weak));
-void **__kmpc_omp_get_target_async_handle_ptr(int32_t gtid)
- __attribute__((weak));
-bool __kmpc_omp_has_task_team(int32_t gtid) __attribute__((weak));
kmp_task_t *__kmpc_omp_task_alloc(ident_t *loc_ref, int32_t gtid, int32_t flags,
size_t sizeof_kmp_task_t,
size_t sizeof_shareds,
@@ -248,8 +198,6 @@ struct TargetMemsetArgsTy {
// no constructors defined, because this is a PoD
};
-// Invalid GTID as defined by libomp; keep in sync
-#define KMP_GTID_DNE (-2)
#ifdef __cplusplus
}
#endif
@@ -319,67 +267,4 @@ printKernelArguments(const ident_t *Loc, const int64_t DeviceId,
}
}
-// Wrapper for task stored async info objects.
-class TaskAsyncInfoWrapperTy {
- const int ExecThreadID = KMP_GTID_DNE;
- AsyncInfoTy LocalAsyncInfo;
- AsyncInfoTy *AsyncInfo = &LocalAsyncInfo;
- void **TaskAsyncInfoPtr = nullptr;
-
-public:
- TaskAsyncInfoWrapperTy(DeviceTy &Device)
- : ExecThreadID(__kmpc_global_thread_num(NULL)), LocalAsyncInfo(Device) {
- // If we failed to acquired the current global thread id, we cannot
- // re-enqueue the current task. Thus we should use the local blocking async
- // info.
- if (ExecThreadID == KMP_GTID_DNE)
- return;
-
- // Only tasks with an assigned task team can be re-enqueue and thus can
- // use the non-blocking synchronization scheme. Thus we should use the local
- // blocking async info, if we don´t have one.
- if (!__kmpc_omp_has_task_team(ExecThreadID))
- return;
-
- // Acquire a pointer to the AsyncInfo stored inside the current task being
- // executed.
- TaskAsyncInfoPtr = __kmpc_omp_get_target_async_handle_ptr(ExecThreadID);
-
- // If we cannot acquire such pointer, fallback to using the local blocking
- // async info.
- if (!TaskAsyncInfoPtr)
- return;
-
- // When creating a new task async info, the task handle must always be
- // invalid. We must never overwrite any task async handle and there should
- // never be any valid handle store inside the task at this point.
- assert((*TaskAsyncInfoPtr) == nullptr &&
- "Task async handle is not empty when dispatching new device "
- "operations. The handle was not cleared properly or "
- "__tgt_target_nowait_query should have been called!");
-
- // If no valid async handle is present, a new AsyncInfo will be allocated
- // and stored in the current task.
- AsyncInfo = new AsyncInfoTy(Device, AsyncInfoTy::SyncTy::NON_BLOCKING);
- *TaskAsyncInfoPtr = (void *)AsyncInfo;
- }
-
- ~TaskAsyncInfoWrapperTy() {
- // Local async info destruction is automatically handled by ~AsyncInfoTy.
- if (AsyncInfo == &LocalAsyncInfo)
- return;
-
- // If the are device operations still pending, return immediately without
- // deallocating the handle.
- if (!AsyncInfo->isDone())
- return;
-
- // Delete the handle and unset it from the OpenMP task data.
- delete AsyncInfo;
- *TaskAsyncInfoPtr = nullptr;
- }
-
- operator AsyncInfoTy &() { return *AsyncInfo; }
-};
-
#endif
``````````
</details>
https://github.com/llvm/llvm-project/pull/73823
More information about the Openmp-commits
mailing list