//===-- OpenMP/InternalTypes.h -- Internal OpenMP Types ------------- C++ -===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // Private type declarations and helper macros for OpenMP. // //===----------------------------------------------------------------------===// #ifndef OMPTARGET_OPENMP_INTERNAL_TYPES_H #define OMPTARGET_OPENMP_INTERNAL_TYPES_H #include #include extern "C" { // Compiler sends us this info: typedef struct kmp_depend_info { intptr_t base_addr; size_t len; struct { bool in : 1; bool out : 1; bool mtx : 1; } 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; // Implemented in libomp, they are called from within __tgt_* functions. int32_t __kmpc_global_thread_num(void *); bool __kmpc_omp_has_task_team(int32_t gtid); void **__kmpc_omp_get_target_async_handle_ptr(int32_t gtid); int __kmpc_get_target_offload(void); kmp_task_t * __kmpc_omp_target_task_alloc(ident_t *loc_ref, int32_t gtid, int32_t flags, size_t sizeof_kmp_task_t, size_t sizeof_shareds, kmp_routine_entry_t task_entry, int64_t device_id); int32_t __kmpc_omp_task_with_deps(ident_t *loc_ref, int32_t gtid, kmp_task_t *new_task, int32_t ndeps, kmp_depend_info_t *dep_list, int32_t ndeps_noalias, kmp_depend_info_t *noalias_dep_list); void __kmpc_omp_wait_deps(ident_t *loc_ref, int32_t gtid, int32_t ndeps, kmp_depend_info_t *dep_list, int32_t ndeps_noalias, kmp_depend_info_t *noalias_dep_list); /** * The argument set that is passed from asynchronous memory copy to block * version of memory copy invoked in helper task */ struct TargetMemcpyArgsTy { /** * Common attribuutes */ void *Dst; const void *Src; int DstDevice; int SrcDevice; /** * The flag that denotes single dimensional or rectangle dimensional copy */ bool IsRectMemcpy; /** * Arguments for single dimensional copy */ size_t Length; size_t DstOffset; size_t SrcOffset; /** * Arguments for rectangle dimensional copy */ size_t ElementSize; int NumDims; const size_t *Volume; const size_t *DstOffsets; const size_t *SrcOffsets; const size_t *DstDimensions; const size_t *SrcDimensions; /** * Constructor for single dimensional copy */ TargetMemcpyArgsTy(void *Dst, const void *Src, size_t Length, size_t DstOffset, size_t SrcOffset, int DstDevice, int SrcDevice) : Dst(Dst), Src(Src), DstDevice(DstDevice), SrcDevice(SrcDevice), IsRectMemcpy(false), Length(Length), DstOffset(DstOffset), SrcOffset(SrcOffset), ElementSize(0), NumDims(0), Volume(0), DstOffsets(0), SrcOffsets(0), DstDimensions(0), SrcDimensions(0){}; /** * Constructor for rectangle dimensional copy */ TargetMemcpyArgsTy(void *Dst, const void *Src, size_t ElementSize, int NumDims, const size_t *Volume, const size_t *DstOffsets, const size_t *SrcOffsets, const size_t *DstDimensions, const size_t *SrcDimensions, int DstDevice, int SrcDevice) : Dst(Dst), Src(Src), DstDevice(DstDevice), SrcDevice(SrcDevice), IsRectMemcpy(true), Length(0), DstOffset(0), SrcOffset(0), ElementSize(ElementSize), NumDims(NumDims), Volume(Volume), DstOffsets(DstOffsets), SrcOffsets(SrcOffsets), DstDimensions(DstDimensions), SrcDimensions(SrcDimensions){}; }; struct TargetMemsetArgsTy { // Common attributes of a memset operation void *Ptr; int C; size_t N; int DeviceNum; // no constructors defined, because this is a PoD }; } // extern "C" #endif // OMPTARGET_OPENMP_INTERNAL_TYPES_H