//====--- OMPGridValues.h - Language-specific address spaces --*- 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 // //===----------------------------------------------------------------------===// /// /// \file /// \brief Provides definitions for Target specific Grid Values /// //===----------------------------------------------------------------------===// #ifndef LLVM_FRONTEND_OPENMP_OMPGRIDVALUES_H #define LLVM_FRONTEND_OPENMP_OMPGRIDVALUES_H namespace llvm { namespace omp { /// \brief Defines various target-specific GPU grid values that must be /// consistent between host RTL (plugin), device RTL, and clang. /// We can change grid values for a "fat" binary so that different /// passes get the correct values when generating code for a /// multi-target binary. Both amdgcn and nvptx values are stored in /// this file. In the future, should there be differences between GPUs /// of the same architecture, then simply make a different array and /// use the new array name. /// /// Example usage in clang: /// const unsigned slot_size = /// ctx.GetTargetInfo().getGridValue().GV_Warp_Size; /// /// Example usage in libomptarget/deviceRTLs: /// #include "llvm/Frontend/OpenMP/OMPGridValues.h" /// #ifdef __AMDGPU__ /// #define GRIDVAL AMDGPUGridValues /// #else /// #define GRIDVAL NVPTXGridValues /// #endif /// ... Then use this reference for GV_Warp_Size in the deviceRTL source. /// llvm::omp::GRIDVAL().GV_Warp_Size /// /// Example usage in libomptarget hsa plugin: /// #include "llvm/Frontend/OpenMP/OMPGridValues.h" /// #define GRIDVAL AMDGPUGridValues /// ... Then use this reference to access GV_Warp_Size in the hsa plugin. /// llvm::omp::GRIDVAL().GV_Warp_Size /// /// Example usage in libomptarget cuda plugin: /// #include "llvm/Frontend/OpenMP/OMPGridValues.h" /// #define GRIDVAL NVPTXGridValues /// ... Then use this reference to access GV_Warp_Size in the cuda plugin. /// llvm::omp::GRIDVAL().GV_Warp_Size /// struct GV { … }; /// For AMDGPU GPUs static constexpr GV AMDGPUGridValues64 = …; static constexpr GV AMDGPUGridValues32 = …; template <unsigned wavesize> constexpr const GV &getAMDGPUGridValues() { … } /// For Nvidia GPUs static constexpr GV NVPTXGridValues = …; } // namespace omp } // namespace llvm #endif // LLVM_FRONTEND_OPENMP_OMPGRIDVALUES_H