| //===-- Shared/Environment.h - OpenMP GPU environments ------------ 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 |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // Environments shared between host and device. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef OMPTARGET_SHARED_ENVIRONMENT_H |
| #define OMPTARGET_SHARED_ENVIRONMENT_H |
| |
| #ifdef OMPTARGET_DEVICE_RUNTIME |
| #include "Types.h" |
| #else |
| #include "SourceInfo.h" |
| |
| #include <cstdint> |
| |
| using IdentTy = ident_t; |
| #endif |
| |
| #include "llvm/Frontend/OpenMP/OMPDeviceConstants.h" |
| |
| enum class DeviceDebugKind : uint32_t { |
| Assertion = 1U << 0, |
| FunctionTracing = 1U << 1, |
| CommonIssues = 1U << 2, |
| AllocationTracker = 1U << 3, |
| }; |
| |
| struct DeviceEnvironmentTy { |
| uint32_t DeviceDebugKind; |
| uint32_t NumDevices; |
| uint32_t DeviceNum; |
| uint32_t DynamicMemSize; |
| uint64_t ClockFrequency; |
| uintptr_t IndirectCallTable; |
| uint64_t IndirectCallTableSize; |
| uint64_t HardwareParallelism; |
| }; |
| |
| struct DeviceMemoryPoolTy { |
| void *Ptr; |
| uint64_t Size; |
| }; |
| |
| struct DeviceMemoryPoolTrackingTy { |
| uint64_t NumAllocations; |
| uint64_t AllocationTotal; |
| uint64_t AllocationMin; |
| uint64_t AllocationMax; |
| |
| void combine(DeviceMemoryPoolTrackingTy &Other) { |
| NumAllocations += Other.NumAllocations; |
| AllocationTotal += Other.AllocationTotal; |
| AllocationMin = AllocationMin > Other.AllocationMin ? Other.AllocationMin |
| : AllocationMin; |
| AllocationMax = AllocationMax < Other.AllocationMax ? Other.AllocationMax |
| : AllocationMax; |
| } |
| }; |
| |
| // NOTE: Please don't change the order of those members as their indices are |
| // used in the middle end. Always add the new data member at the end. |
| // Different from KernelEnvironmentTy below, this structure contains members |
| // that might be modified at runtime. |
| struct DynamicEnvironmentTy { |
| /// Current indentation level for the function trace. Only accessed by thread |
| /// 0. |
| uint16_t DebugIndentionLevel; |
| }; |
| |
| // NOTE: Please don't change the order of those members as their indices are |
| // used in the middle end. Always add the new data member at the end. |
| struct ConfigurationEnvironmentTy { |
| uint8_t UseGenericStateMachine = 2; |
| uint8_t MayUseNestedParallelism = 2; |
| llvm::omp::OMPTgtExecModeFlags ExecMode = llvm::omp::OMP_TGT_EXEC_MODE_SPMD; |
| // Information about (legal) launch configurations. |
| //{ |
| int32_t MinThreads = -1; |
| int32_t MaxThreads = -1; |
| int32_t MinTeams = -1; |
| int32_t MaxTeams = -1; |
| int32_t ReductionDataSize = 0; |
| int32_t ReductionBufferLength = 0; |
| //} |
| }; |
| |
| // NOTE: Please don't change the order of those members as their indices are |
| // used in the middle end. Always add the new data member at the end. |
| struct KernelEnvironmentTy { |
| ConfigurationEnvironmentTy Configuration; |
| IdentTy *Ident = nullptr; |
| DynamicEnvironmentTy *DynamicEnv = nullptr; |
| }; |
| |
| struct KernelLaunchEnvironmentTy { |
| uint32_t ReductionCnt = 0; |
| uint32_t ReductionIterCnt = 0; |
| void *ReductionBuffer = nullptr; |
| }; |
| |
| #endif // OMPTARGET_SHARED_ENVIRONMENT_H |