MLIR  20.0.0git
Utils.h
Go to the documentation of this file.
1 //===- Utils.h - MLIR ROCDL target utils ------------------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This files declares ROCDL target related utility classes and functions.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef MLIR_TARGET_LLVM_ROCDL_UTILS_H
14 #define MLIR_TARGET_LLVM_ROCDL_UTILS_H
15 
19 #include "mlir/Support/LLVM.h"
21 
22 namespace mlir {
23 namespace ROCDL {
24 /// Searches & returns the path ROCM toolkit path, the search order is:
25 /// 1. The `ROCM_PATH` environment variable.
26 /// 2. The `ROCM_ROOT` environment variable.
27 /// 3. The `ROCM_HOME` environment variable.
28 /// 4. The ROCM path detected by CMake.
29 /// 5. Returns an empty string.
30 StringRef getROCMPath();
31 
32 /// Helper enum for specifying the AMD GCN device libraries required for
33 /// compilation.
34 enum class AMDGCNLibraries : uint32_t {
35  None = 0,
36  Ockl = 1,
37  Ocml = 2,
38  OpenCL = 4,
39  Hip = 8,
40  LastLib = Hip,
42  All = (LastLib << 1) - 1
43 };
44 
45 /// Base class for all ROCDL serializations from GPU modules into binary
46 /// strings. By default this class serializes into LLVM bitcode.
48 public:
49  /// Initializes the `toolkitPath` with the path in `targetOptions` or if empty
50  /// with the path in `getROCMPath`.
52  const gpu::TargetOptions &targetOptions = {});
53 
54  /// Initializes the LLVM AMDGPU target by safely calling
55  /// `LLVMInitializeAMDGPU*` methods if available.
56  static void init();
57 
58  /// Returns the target attribute.
59  ROCDLTargetAttr getTarget() const;
60 
61  /// Returns the ROCM toolkit path.
62  StringRef getToolkitPath() const;
63 
64  /// Returns the bitcode files to be loaded.
66 
67  /// Appends standard ROCm device libraries to `fileList`.
68  LogicalResult appendStandardLibs(AMDGCNLibraries libs);
69 
70  /// Loads the bitcode files in `fileList`.
71  virtual std::optional<SmallVector<std::unique_ptr<llvm::Module>>>
72  loadBitcodeFiles(llvm::Module &module) override;
73 
74  /// Determines required Device Libraries and adds `oclc` control variables to
75  /// the LLVM Module if needed. Also sets
76  /// `amdhsa_code_object_version` module flag.
77  void handleModulePreLink(llvm::Module &module) override;
78 
79  /// Removes unnecessary metadata from the loaded bitcode files.
80  LogicalResult handleBitcodeFile(llvm::Module &module) override;
81 
82 protected:
83  /// Adds `oclc` control variables to the LLVM Module if needed. It also sets
84  /// `amdhsa_code_object_version` module flag which is equal to ABI version and
85  /// it uses "llvm::Module::Error" to set that flag.
86  void addControlVariables(llvm::Module &module, AMDGCNLibraries libs,
87  bool wave64, bool daz, bool finiteOnly,
88  bool unsafeMath, bool fastMath, bool correctSqrt,
89  StringRef abiVer);
90 
91  /// Compiles assembly to a binary.
92  virtual std::optional<SmallVector<char, 0>>
93  compileToBinary(const std::string &serializedISA);
94 
95  /// Default implementation of `ModuleToObject::moduleToObject`.
96  std::optional<SmallVector<char, 0>>
97  moduleToObjectImpl(const gpu::TargetOptions &targetOptions,
98  llvm::Module &llvmModule);
99 
100  /// Returns the assembled ISA.
101  std::optional<SmallVector<char, 0>> assembleIsa(StringRef isa);
102 
103  /// ROCDL target attribute.
104  ROCDLTargetAttr target;
105 
106  /// ROCM toolkit path.
107  std::string toolkitPath;
108 
109  /// List of LLVM bitcode files to link to.
111 
112  /// AMD GCN libraries to use when linking, the default is using none.
114 };
115 
116 /// Returns a map containing the `amdhsa.kernels` ELF metadata for each of the
117 /// kernels in the binary, or `std::nullopt` if the metadata couldn't be
118 /// retrieved. The map associates the name of the kernel with the list of named
119 /// attributes found in `amdhsa.kernels`. For more information on the ELF
120 /// metadata see: https://llvm.org/docs/AMDGPUUsage.html#amdhsa
121 std::optional<DenseMap<StringAttr, NamedAttrList>>
123 
124 /// Returns a `#gpu.kernel_table` containing kernel metadata for each of the
125 /// kernels in `gpuModule`. If `elfData` is valid, then the `amdhsa.kernels` ELF
126 /// metadata will be added to the `#gpu.kernel_table`.
127 gpu::KernelTableAttr getKernelMetadata(Operation *gpuModule,
128  ArrayRef<char> elfData = {});
129 } // namespace ROCDL
130 } // namespace mlir
131 
132 #endif // MLIR_TARGET_LLVM_ROCDL_UTILS_H
This class is a general helper class for creating context-global objects like types,...
Definition: Builders.h:50
Utility base class for transforming operations into binary objects, by default it returns the seriali...
Operation & module
Module to transform to a binary object.
Operation is the basic unit of execution within MLIR.
Definition: Operation.h:88
Base class for all ROCDL serializations from GPU modules into binary strings.
Definition: Utils.h:47
ROCDLTargetAttr getTarget() const
Returns the target attribute.
Definition: Target.cpp:127
ArrayRef< std::string > getFileList() const
Returns the bitcode files to be loaded.
Definition: Target.cpp:131
AMDGCNLibraries deviceLibs
AMD GCN libraries to use when linking, the default is using none.
Definition: Utils.h:113
ROCDLTargetAttr target
ROCDL target attribute.
Definition: Utils.h:104
SerializeGPUModuleBase(Operation &module, ROCDLTargetAttr target, const gpu::TargetOptions &targetOptions={})
Initializes the toolkitPath with the path in targetOptions or if empty with the path in getROCMPath.
Definition: Target.cpp:94
std::optional< SmallVector< char, 0 > > moduleToObjectImpl(const gpu::TargetOptions &targetOptions, llvm::Module &llvmModule)
Default implementation of ModuleToObject::moduleToObject.
Definition: Target.cpp:405
virtual std::optional< SmallVector< std::unique_ptr< llvm::Module > > > loadBitcodeFiles(llvm::Module &module) override
Loads the bitcode files in fileList.
Definition: Target.cpp:179
void addControlVariables(llvm::Module &module, AMDGCNLibraries libs, bool wave64, bool daz, bool finiteOnly, bool unsafeMath, bool fastMath, bool correctSqrt, StringRef abiVer)
Adds oclc control variables to the LLVM Module if needed.
Definition: Target.cpp:230
std::optional< SmallVector< char, 0 > > assembleIsa(StringRef isa)
Returns the assembled ISA.
Definition: Target.cpp:282
SmallVector< std::string > fileList
List of LLVM bitcode files to link to.
Definition: Utils.h:110
std::string toolkitPath
ROCM toolkit path.
Definition: Utils.h:107
static void init()
Initializes the LLVM AMDGPU target by safely calling LLVMInitializeAMDGPU* methods if available.
Definition: Target.cpp:113
StringRef getToolkitPath() const
Returns the ROCM toolkit path.
Definition: Target.cpp:129
LogicalResult appendStandardLibs(AMDGCNLibraries libs)
Appends standard ROCm device libraries to fileList.
Definition: Target.cpp:135
LogicalResult handleBitcodeFile(llvm::Module &module) override
Removes unnecessary metadata from the loaded bitcode files.
Definition: Target.cpp:192
virtual std::optional< SmallVector< char, 0 > > compileToBinary(const std::string &serializedISA)
Compiles assembly to a binary.
Definition: Target.cpp:346
void handleModulePreLink(llvm::Module &module) override
Determines required Device Libraries and adds oclc control variables to the LLVM Module if needed.
Definition: Target.cpp:205
This class serves as an opaque interface for passing options to the TargetAttrInterface methods.
AMDGCNLibraries
Helper enum for specifying the AMD GCN device libraries required for compilation.
Definition: Utils.h:34
std::optional< DenseMap< StringAttr, NamedAttrList > > getAMDHSAKernelsELFMetadata(Builder &builder, ArrayRef< char > elfData)
Returns a map containing the amdhsa.kernels ELF metadata for each of the kernels in the binary,...
Definition: Utils.cpp:24
gpu::KernelTableAttr getKernelMetadata(Operation *gpuModule, ArrayRef< char > elfData={})
Returns a #gpu.kernel_table containing kernel metadata for each of the kernels in gpuModule.
Definition: Utils.cpp:71
StringRef getROCMPath()
Searches & returns the path ROCM toolkit path, the search order is:
Definition: Target.cpp:84
Include the generated interface declarations.