//===-- 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