From d4ecd1241ccdb2322ab87335f454151c5aee3104 Mon Sep 17 00:00:00 2001 From: Shilei Tian Date: Sat, 22 Apr 2023 20:56:35 -0400 Subject: Revert "[OpenMP] Introduce kernel environment" This reverts commit 35cfadfbe2decd9633560b3046fa6c17523b2fa9. It makes a couple of buildbots unhappy because of the following test failures: - `Transforms/OpenMP/add_attributes.ll'` - `mapping/declare_mapper_target_data.cpp` on AMDGPU --- openmp/libomptarget/DeviceRTL/CMakeLists.txt | 1 - openmp/libomptarget/DeviceRTL/include/Debug.h | 2 + openmp/libomptarget/DeviceRTL/include/Interface.h | 8 ++- openmp/libomptarget/DeviceRTL/include/State.h | 8 +-- .../libomptarget/DeviceRTL/src/Configuration.cpp | 6 +-- openmp/libomptarget/DeviceRTL/src/Debug.cpp | 16 +++--- openmp/libomptarget/DeviceRTL/src/Kernel.cpp | 28 +++++----- openmp/libomptarget/DeviceRTL/src/State.cpp | 13 ++--- openmp/libomptarget/include/DeviceEnvironment.h | 25 +++++++++ openmp/libomptarget/include/Environment.h | 61 ---------------------- .../plugins-nextgen/amdgpu/src/rtl.cpp | 2 +- .../common/PluginInterface/PluginInterface.cpp | 47 ++++++----------- .../common/PluginInterface/PluginInterface.h | 7 +-- .../libomptarget/plugins-nextgen/cuda/src/rtl.cpp | 2 +- .../plugins-nextgen/generic-elf-64bit/src/rtl.cpp | 2 +- openmp/libomptarget/plugins/amdgpu/src/rtl.cpp | 2 +- openmp/libomptarget/plugins/cuda/src/rtl.cpp | 2 +- 17 files changed, 79 insertions(+), 153 deletions(-) create mode 100644 openmp/libomptarget/include/DeviceEnvironment.h delete mode 100644 openmp/libomptarget/include/Environment.h (limited to 'openmp') diff --git a/openmp/libomptarget/DeviceRTL/CMakeLists.txt b/openmp/libomptarget/DeviceRTL/CMakeLists.txt index b55b236457a1..8419b87ef622 100644 --- a/openmp/libomptarget/DeviceRTL/CMakeLists.txt +++ b/openmp/libomptarget/DeviceRTL/CMakeLists.txt @@ -126,7 +126,6 @@ set(bc_flags -c -foffload-lto -std=c++17 -fvisibility=hidden -nocudalib -nogpulib -nostdinc -fopenmp -fopenmp-cuda-mode -Wno-unknown-cuda-version - -DOMPTARGET_DEVICE_RUNTIME -I${include_directory} -I${devicertl_base_directory}/../include ${LIBOMPTARGET_LLVM_INCLUDE_DIRS_DEVICERTL} diff --git a/openmp/libomptarget/DeviceRTL/include/Debug.h b/openmp/libomptarget/DeviceRTL/include/Debug.h index 00e18c9b5650..128572dfec60 100644 --- a/openmp/libomptarget/DeviceRTL/include/Debug.h +++ b/openmp/libomptarget/DeviceRTL/include/Debug.h @@ -50,6 +50,8 @@ void __assert_fail(const char *assertion, const char *file, unsigned line, struct DebugEntryRAII { DebugEntryRAII(const char *File, const unsigned Line, const char *Function); ~DebugEntryRAII(); + + static void init(); }; #endif diff --git a/openmp/libomptarget/DeviceRTL/include/Interface.h b/openmp/libomptarget/DeviceRTL/include/Interface.h index 8b6019b9dc2a..648da49b86f5 100644 --- a/openmp/libomptarget/DeviceRTL/include/Interface.h +++ b/openmp/libomptarget/DeviceRTL/include/Interface.h @@ -214,14 +214,12 @@ uint32_t __kmpc_get_warp_size(); /// Kernel /// ///{ -// Forward declaration -struct KernelEnvironmentTy; - int8_t __kmpc_is_spmd_exec_mode(); -int32_t __kmpc_target_init(KernelEnvironmentTy &KernelEnvironment); +int32_t __kmpc_target_init(IdentTy *Ident, int8_t Mode, + bool UseGenericStateMachine); -void __kmpc_target_deinit(); +void __kmpc_target_deinit(IdentTy *Ident, int8_t Mode); ///} diff --git a/openmp/libomptarget/DeviceRTL/include/State.h b/openmp/libomptarget/DeviceRTL/include/State.h index 04af48db5620..aac5a2275fca 100644 --- a/openmp/libomptarget/DeviceRTL/include/State.h +++ b/openmp/libomptarget/DeviceRTL/include/State.h @@ -17,9 +17,6 @@ #include "Types.h" #include "Utils.h" -// Forward declaration. -struct KernelEnvironmentTy; - #pragma omp begin declare target device_type(nohost) namespace ompx { @@ -116,10 +113,7 @@ extern ThreadStateTy **ThreadStates; #pragma omp allocate(ThreadStates) allocator(omp_pteam_mem_alloc) /// Initialize the state machinery. Must be called by all threads. -void init(bool IsSPMD, KernelEnvironmentTy &KernelEnvironment); - -/// Return the kernel environment associated with the current kernel. -KernelEnvironmentTy &getKernelEnvironment(); +void init(bool IsSPMD); /// TODO enum ValueKind { diff --git a/openmp/libomptarget/DeviceRTL/src/Configuration.cpp b/openmp/libomptarget/DeviceRTL/src/Configuration.cpp index 2548198ffc68..ceccef625ed2 100644 --- a/openmp/libomptarget/DeviceRTL/src/Configuration.cpp +++ b/openmp/libomptarget/DeviceRTL/src/Configuration.cpp @@ -12,7 +12,7 @@ //===----------------------------------------------------------------------===// #include "Configuration.h" -#include "Environment.h" +#include "DeviceEnvironment.h" #include "State.h" #include "Types.h" @@ -53,9 +53,7 @@ bool config::isDebugMode(config::DebugKind Kind) { bool config::mayUseThreadStates() { return !__omp_rtl_assume_no_thread_state; } bool config::mayUseNestedParallelism() { - if (__omp_rtl_assume_no_nested_parallelism) - return false; - return state::getKernelEnvironment().Configuration.MayUseNestedParallelism; + return !__omp_rtl_assume_no_nested_parallelism; } #pragma omp end declare target diff --git a/openmp/libomptarget/DeviceRTL/src/Debug.cpp b/openmp/libomptarget/DeviceRTL/src/Debug.cpp index 5a7bf80551b6..a1b289e83022 100644 --- a/openmp/libomptarget/DeviceRTL/src/Debug.cpp +++ b/openmp/libomptarget/DeviceRTL/src/Debug.cpp @@ -12,10 +12,8 @@ #include "Debug.h" #include "Configuration.h" -#include "Environment.h" #include "Interface.h" #include "Mapping.h" -#include "State.h" #include "Types.h" using namespace ompx; @@ -33,14 +31,15 @@ void __assert_fail(const char *assertion, const char *file, unsigned line, } } +/// Current indentation level for the function trace. Only accessed by thread 0. +__attribute__((loader_uninitialized)) static uint32_t Level; +#pragma omp allocate(Level) allocator(omp_pteam_mem_alloc) + DebugEntryRAII::DebugEntryRAII(const char *File, const unsigned Line, const char *Function) { if (config::isDebugMode(config::DebugKind::FunctionTracing) && mapping::getThreadIdInBlock() == 0 && mapping::getBlockId() == 0) { - uint16_t &Level = - state::getKernelEnvironment().DynamicEnv->DebugIndentionLevel; - for (int I = 0; I < Level; ++I) PRINTF("%s", " "); @@ -52,11 +51,10 @@ DebugEntryRAII::DebugEntryRAII(const char *File, const unsigned Line, DebugEntryRAII::~DebugEntryRAII() { if (config::isDebugMode(config::DebugKind::FunctionTracing) && - mapping::getThreadIdInBlock() == 0 && mapping::getBlockId() == 0) { - uint16_t &Level = - state::getKernelEnvironment().DynamicEnv->DebugIndentionLevel; + mapping::getThreadIdInBlock() == 0 && mapping::getBlockId() == 0) Level--; - } } +void DebugEntryRAII::init() { Level = 0; } + #pragma omp end declare target diff --git a/openmp/libomptarget/DeviceRTL/src/Kernel.cpp b/openmp/libomptarget/DeviceRTL/src/Kernel.cpp index 9ab1b5f57be4..fa774afe469b 100644 --- a/openmp/libomptarget/DeviceRTL/src/Kernel.cpp +++ b/openmp/libomptarget/DeviceRTL/src/Kernel.cpp @@ -11,7 +11,6 @@ //===----------------------------------------------------------------------===// #include "Debug.h" -#include "Environment.h" #include "Interface.h" #include "Mapping.h" #include "State.h" @@ -24,12 +23,11 @@ using namespace ompx; #pragma omp begin declare target device_type(nohost) -static void inititializeRuntime(bool IsSPMD, - KernelEnvironmentTy &KernelEnvironment) { +static void inititializeRuntime(bool IsSPMD) { // Order is important here. synchronize::init(IsSPMD); mapping::init(IsSPMD); - state::init(IsSPMD, KernelEnvironment); + state::init(IsSPMD); } /// Simple generic state machine for worker threads. @@ -69,17 +67,16 @@ extern "C" { /// /// \param Ident Source location identification, can be NULL. /// -int32_t __kmpc_target_init(KernelEnvironmentTy &KernelEnvironment) { +int32_t __kmpc_target_init(IdentTy *Ident, int8_t Mode, + bool UseGenericStateMachine) { FunctionTracingRAII(); - ConfigurationEnvironmentTy &Configuration = KernelEnvironment.Configuration; - bool IsSPMD = Configuration.ExecMode & - llvm::omp::OMPTgtExecModeFlags::OMP_TGT_EXEC_MODE_SPMD; - bool UseGenericStateMachine = Configuration.UseGenericStateMachine; + const bool IsSPMD = + Mode & llvm::omp::OMPTgtExecModeFlags::OMP_TGT_EXEC_MODE_SPMD; if (IsSPMD) { - inititializeRuntime(/* IsSPMD */ true, KernelEnvironment); + inititializeRuntime(/* IsSPMD */ true); synchronize::threadsAligned(atomic::relaxed); } else { - inititializeRuntime(/* IsSPMD */ false, KernelEnvironment); + inititializeRuntime(/* IsSPMD */ false); // No need to wait since only the main threads will execute user // code and workers will run into a barrier right away. } @@ -111,7 +108,7 @@ int32_t __kmpc_target_init(KernelEnvironmentTy &KernelEnvironment) { // thread's warp, so none of its threads can ever be active worker threads. if (UseGenericStateMachine && mapping::getThreadIdInBlock() < mapping::getBlockSize(IsSPMD)) { - genericStateMachine(KernelEnvironment.Ident); + genericStateMachine(Ident); } else { // Retrieve the work function just to ensure we always call // __kmpc_kernel_parallel even if a custom state machine is used. @@ -135,10 +132,11 @@ int32_t __kmpc_target_init(KernelEnvironmentTy &KernelEnvironment) { /// /// \param Ident Source location identification, can be NULL. /// -void __kmpc_target_deinit() { +void __kmpc_target_deinit(IdentTy *Ident, int8_t Mode) { FunctionTracingRAII(); - bool IsSPMD = mapping::isSPMDMode(); - state::assumeInitialState(IsSPMD); + const bool IsSPMD = + Mode & llvm::omp::OMPTgtExecModeFlags::OMP_TGT_EXEC_MODE_SPMD; + if (IsSPMD) return; diff --git a/openmp/libomptarget/DeviceRTL/src/State.cpp b/openmp/libomptarget/DeviceRTL/src/State.cpp index 09d024d17d2f..9c1c9abaf493 100644 --- a/openmp/libomptarget/DeviceRTL/src/State.cpp +++ b/openmp/libomptarget/DeviceRTL/src/State.cpp @@ -9,8 +9,8 @@ //===----------------------------------------------------------------------===// #include "State.h" +#include "Configuration.h" #include "Debug.h" -#include "Environment.h" #include "Interface.h" #include "Mapping.h" #include "Synchronization.h" @@ -34,9 +34,6 @@ constexpr const uint32_t Alignment = 16; extern unsigned char DynamicSharedBuffer[] __attribute__((aligned(Alignment))); #pragma omp allocate(DynamicSharedBuffer) allocator(omp_pteam_mem_alloc) -/// The kernel environment passed to the init method by the compiler. -static KernelEnvironmentTy *SHARED(KernelEnvironmentPtr); - namespace { /// Fallback implementations are missing to trigger a link time error. @@ -244,19 +241,15 @@ int returnValIfLevelIsActive(int Level, int Val, int DefaultVal, } // namespace -void state::init(bool IsSPMD, KernelEnvironmentTy &KernelEnvironment) { +void state::init(bool IsSPMD) { SharedMemorySmartStack.init(IsSPMD); if (mapping::isInitialThreadInLevel0(IsSPMD)) { TeamState.init(IsSPMD); + DebugEntryRAII::init(); ThreadStates = nullptr; - KernelEnvironmentPtr = &KernelEnvironment; } } -KernelEnvironmentTy &state::getKernelEnvironment() { - return *KernelEnvironmentPtr; -} - void state::enterDataEnvironment(IdentTy *Ident) { ASSERT(config::mayUseThreadStates() && "Thread state modified while explicitly disabled!"); diff --git a/openmp/libomptarget/include/DeviceEnvironment.h b/openmp/libomptarget/include/DeviceEnvironment.h new file mode 100644 index 000000000000..231492c68f76 --- /dev/null +++ b/openmp/libomptarget/include/DeviceEnvironment.h @@ -0,0 +1,25 @@ +//===---- device_environment.h - OpenMP GPU device environment ---- 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 +// +//===----------------------------------------------------------------------===// +// +// Global device environment +// +//===----------------------------------------------------------------------===// + +#ifndef _OMPTARGET_DEVICE_ENVIRONMENT_H_ +#define _OMPTARGET_DEVICE_ENVIRONMENT_H_ + +// deviceRTL uses and DeviceRTL uses explicit definitions + +struct DeviceEnvironmentTy { + uint32_t DebugKind; + uint32_t NumDevices; + uint32_t DeviceNum; + uint32_t DynamicMemSize; +}; + +#endif diff --git a/openmp/libomptarget/include/Environment.h b/openmp/libomptarget/include/Environment.h deleted file mode 100644 index 5eb590908660..000000000000 --- a/openmp/libomptarget/include/Environment.h +++ /dev/null @@ -1,61 +0,0 @@ -//===------------ 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_ENVIRONMENT_H_ -#define _OMPTARGET_ENVIRONMENT_H_ - -#ifdef OMPTARGET_DEVICE_RUNTIME -#include "Types.h" -#else -#include "SourceInfo.h" - -#include - -using IdentTy = ident_t; -#endif - -#include "llvm/Frontend/OpenMP/OMPDeviceConstants.h" - -struct DeviceEnvironmentTy { - uint32_t DebugKind; - uint32_t NumDevices; - uint32_t DeviceNum; - uint32_t DynamicMemSize; -}; - -// 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; - uint8_t MayUseNestedParallelism; - llvm::omp::OMPTgtExecModeFlags ExecMode; -}; - -// 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; - DynamicEnvironmentTy *DynamicEnv; -}; - -#endif // _OMPTARGET_ENVIRONMENT_H_ diff --git a/openmp/libomptarget/plugins-nextgen/amdgpu/src/rtl.cpp b/openmp/libomptarget/plugins-nextgen/amdgpu/src/rtl.cpp index 59e69f858ed7..f9b0371f903a 100644 --- a/openmp/libomptarget/plugins-nextgen/amdgpu/src/rtl.cpp +++ b/openmp/libomptarget/plugins-nextgen/amdgpu/src/rtl.cpp @@ -21,7 +21,7 @@ #include #include "Debug.h" -#include "Environment.h" +#include "DeviceEnvironment.h" #include "GlobalHandler.h" #include "PluginInterface.h" #include "Utilities.h" diff --git a/openmp/libomptarget/plugins-nextgen/common/PluginInterface/PluginInterface.cpp b/openmp/libomptarget/plugins-nextgen/common/PluginInterface/PluginInterface.cpp index 1e551e5ba16d..7ebc1d1092cd 100644 --- a/openmp/libomptarget/plugins-nextgen/common/PluginInterface/PluginInterface.cpp +++ b/openmp/libomptarget/plugins-nextgen/common/PluginInterface/PluginInterface.cpp @@ -582,45 +582,32 @@ Error GenericDeviceTy::registerKernelOffloadEntry( return Plugin::success(); } -Expected -GenericDeviceTy::getKernelEnvironmentForKernel(StringRef Name, - DeviceImageTy &Image) { - // Create a metadata object for the kernel environment object. - StaticGlobalTy KernelEnv(Name.data(), - "_kernel_environment"); - - // Retrieve kernel environment object for the kernel. +Expected +GenericDeviceTy::getExecutionModeForKernel(StringRef Name, + DeviceImageTy &Image) { + // Create a metadata object for the exec mode global (auto-generated). + StaticGlobalTy ExecModeGlobal(Name.data(), + "_exec_mode"); + + // Retrieve execution mode for the kernel. This may fail since some kernels + // may not have an execution mode. GenericGlobalHandlerTy &GHandler = Plugin::get().getGlobalHandler(); - if (auto Err = GHandler.readGlobalFromImage(*this, Image, KernelEnv)) { + if (auto Err = GHandler.readGlobalFromImage(*this, Image, ExecModeGlobal)) { // Consume the error since it is acceptable to fail. [[maybe_unused]] std::string ErrStr = toString(std::move(Err)); - DP("Failed to read kernel environment object for '%s': %s\n", Name.data(), - ErrStr.data()); - - return createStringError(inconvertibleErrorCode(), ErrStr); - } + DP("Failed to read execution mode for '%s': %s\n" + "Using default SPMD (2) execution mode\n", + Name.data(), ErrStr.data()); - return KernelEnv.getValue(); -} - -Expected -GenericDeviceTy::getExecutionModeForKernel(StringRef Name, - DeviceImageTy &Image) { - auto KernelEnvOrError = getKernelEnvironmentForKernel(Name, Image); - if (!KernelEnvOrError) { - (void)KernelEnvOrError.takeError(); return OMP_TGT_EXEC_MODE_SPMD; } - auto &KernelEnv = *KernelEnvOrError; - auto ExecMode = KernelEnv.Configuration.ExecMode; - // Check that the retrieved execution mode is valid. - if (!GenericKernelTy::isValidExecutionMode(ExecMode)) - return Plugin::error("Invalid execution mode %d for '%s'", ExecMode, - Name.data()); + if (!GenericKernelTy::isValidExecutionMode(ExecModeGlobal.getValue())) + return Plugin::error("Invalid execution mode %d for '%s'", + ExecModeGlobal.getValue(), Name.data()); - return ExecMode; + return ExecModeGlobal.getValue(); } Error PinnedAllocationMapTy::insertEntry(void *HstPtr, void *DevAccessiblePtr, diff --git a/openmp/libomptarget/plugins-nextgen/common/PluginInterface/PluginInterface.h b/openmp/libomptarget/plugins-nextgen/common/PluginInterface/PluginInterface.h index 2b64b6f9571c..a91ea81183c2 100644 --- a/openmp/libomptarget/plugins-nextgen/common/PluginInterface/PluginInterface.h +++ b/openmp/libomptarget/plugins-nextgen/common/PluginInterface/PluginInterface.h @@ -19,7 +19,7 @@ #include #include "Debug.h" -#include "Environment.h" +#include "DeviceEnvironment.h" #include "GlobalHandler.h" #include "JIT.h" #include "MemoryManager.h" @@ -748,11 +748,6 @@ protected: /// Map of host pinned allocations used for optimize device transfers. PinnedAllocationMapTy PinnedAllocs; - -private: - /// Return the kernel environment object for kernel \p Name. - Expected - getKernelEnvironmentForKernel(StringRef Name, DeviceImageTy &Image); }; /// Class implementing common functionalities of offload plugins. Each plugin diff --git a/openmp/libomptarget/plugins-nextgen/cuda/src/rtl.cpp b/openmp/libomptarget/plugins-nextgen/cuda/src/rtl.cpp index 34c25099a016..9e38d851196c 100644 --- a/openmp/libomptarget/plugins-nextgen/cuda/src/rtl.cpp +++ b/openmp/libomptarget/plugins-nextgen/cuda/src/rtl.cpp @@ -17,7 +17,7 @@ #include #include "Debug.h" -#include "Environment.h" +#include "DeviceEnvironment.h" #include "GlobalHandler.h" #include "PluginInterface.h" diff --git a/openmp/libomptarget/plugins-nextgen/generic-elf-64bit/src/rtl.cpp b/openmp/libomptarget/plugins-nextgen/generic-elf-64bit/src/rtl.cpp index d56789b7609d..a9b828826b1b 100644 --- a/openmp/libomptarget/plugins-nextgen/generic-elf-64bit/src/rtl.cpp +++ b/openmp/libomptarget/plugins-nextgen/generic-elf-64bit/src/rtl.cpp @@ -17,7 +17,7 @@ #include #include "Debug.h" -#include "Environment.h" +#include "DeviceEnvironment.h" #include "GlobalHandler.h" #include "PluginInterface.h" #include "omptarget.h" diff --git a/openmp/libomptarget/plugins/amdgpu/src/rtl.cpp b/openmp/libomptarget/plugins/amdgpu/src/rtl.cpp index 370b764e969b..d25a520326b9 100644 --- a/openmp/libomptarget/plugins/amdgpu/src/rtl.cpp +++ b/openmp/libomptarget/plugins/amdgpu/src/rtl.cpp @@ -37,7 +37,7 @@ #include "internal.h" #include "rt.h" -#include "Environment.h" +#include "DeviceEnvironment.h" #include "get_elf_mach_gfx_name.h" #include "omptargetplugin.h" #include "print_tracing.h" diff --git a/openmp/libomptarget/plugins/cuda/src/rtl.cpp b/openmp/libomptarget/plugins/cuda/src/rtl.cpp index b9d2a82c92fb..871047494c27 100644 --- a/openmp/libomptarget/plugins/cuda/src/rtl.cpp +++ b/openmp/libomptarget/plugins/cuda/src/rtl.cpp @@ -23,7 +23,7 @@ #include #include "Debug.h" -#include "Environment.h" +#include "DeviceEnvironment.h" #include "omptarget.h" #include "omptargetplugin.h" -- cgit v1.2.1