[Mlir-commits] [mlir] 444abb3 - [mlir][gpu] Add a symbol table field to TargetOptions and adjust GpuModuleToBinary (#65797)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Sat Sep 9 16:59:24 PDT 2023
Author: Fabian Mora
Date: 2023-09-09T19:59:20-04:00
New Revision: 444abb396c340e52a8a4db5778b7d6b3b6195070
URL: https://github.com/llvm/llvm-project/commit/444abb396c340e52a8a4db5778b7d6b3b6195070
DIFF: https://github.com/llvm/llvm-project/commit/444abb396c340e52a8a4db5778b7d6b3b6195070.diff
LOG: [mlir][gpu] Add a symbol table field to TargetOptions and adjust GpuModuleToBinary (#65797)
This patch adds the option of building an optional symbol table for the
top operation in the `gpu-module-to-binary` pass. The table is not
created by default as most targets don't need it; instead, it is lazily
built. The table is passed through a callback in `TargetOptions`.
This patch is required to integrate #65539 .
Added:
Modified:
mlir/include/mlir/Dialect/GPU/IR/CompilationInterfaces.h
mlir/include/mlir/Dialect/GPU/Transforms/Passes.td
mlir/lib/Dialect/GPU/IR/GPUDialect.cpp
mlir/lib/Dialect/GPU/Transforms/ModuleToBinary.cpp
Removed:
################################################################################
diff --git a/mlir/include/mlir/Dialect/GPU/IR/CompilationInterfaces.h b/mlir/include/mlir/Dialect/GPU/IR/CompilationInterfaces.h
index e0bf560dbd98b92..a1f64be57fa699d 100644
--- a/mlir/include/mlir/Dialect/GPU/IR/CompilationInterfaces.h
+++ b/mlir/include/mlir/Dialect/GPU/IR/CompilationInterfaces.h
@@ -20,6 +20,7 @@ class IRBuilderBase;
}
namespace mlir {
+class SymbolTable;
namespace LLVM {
class ModuleTranslation;
}
@@ -55,11 +56,13 @@ class TargetOptions {
} CompilationTarget;
/// Constructor initializing the toolkit path, the list of files to link to,
- /// extra command line options & the compilation target. The default
- /// compilation target is `binary`.
+ /// extra command line options, the compilation target and a callback for
+ /// obtaining the parent symbol table. The default compilation target is
+ /// `binOrFatbin`.
TargetOptions(StringRef toolkitPath = {},
ArrayRef<std::string> linkFiles = {}, StringRef cmdOptions = {},
- CompilationTarget compilationTarget = binOrFatbin);
+ CompilationTarget compilationTarget = binOrFatbin,
+ function_ref<SymbolTable *()> getSymbolTableCallback = {});
/// Returns the typeID.
TypeID getTypeID() const;
@@ -80,12 +83,20 @@ class TargetOptions {
/// Returns the compilation target.
CompilationTarget getCompilationTarget() const;
+ /// Returns the result of the `getSymbolTableCallback` callback or a nullptr
+ /// if no callback was provided.
+ /// Note: The callback itself can return nullptr. It is up to the target how
+ /// to react to getting a nullptr, e.g., emitting an error or constructing the
+ /// table.
+ SymbolTable *getSymbolTable() const;
+
protected:
/// Derived classes must use this constructor to initialize `typeID` to the
/// appropiate value: ie. `TargetOptions(TypeID::get<DerivedClass>())`.
TargetOptions(TypeID typeID, StringRef toolkitPath = {},
ArrayRef<std::string> linkFiles = {}, StringRef cmdOptions = {},
- CompilationTarget compilationTarget = binOrFatbin);
+ CompilationTarget compilationTarget = binOrFatbin,
+ function_ref<SymbolTable *()> getSymbolTableCallback = {});
/// Path to the target toolkit.
std::string toolkitPath;
@@ -100,6 +111,10 @@ class TargetOptions {
/// Compilation process target representation.
CompilationTarget compilationTarget;
+ /// Callback for obtaining the parent symbol table of all the GPU modules
+ /// being serialized.
+ function_ref<SymbolTable *()> getSymbolTableCallback;
+
private:
TypeID typeID;
};
diff --git a/mlir/include/mlir/Dialect/GPU/Transforms/Passes.td b/mlir/include/mlir/Dialect/GPU/Transforms/Passes.td
index ba8a6266604e46c..0bfb2750992058f 100644
--- a/mlir/include/mlir/Dialect/GPU/Transforms/Passes.td
+++ b/mlir/include/mlir/Dialect/GPU/Transforms/Passes.td
@@ -64,9 +64,11 @@ def GpuModuleToBinaryPass
with an object for every target.
The `format` argument can have the following values:
- 1. `offloading`, `llvm`: producing an offloading representation.
- 2. `assembly`, `isa`: producing assembly code.
- 3. `binary`, `bin`: producing binaries.
+ 1. `offloading`, `llvm`: produces an offloading representation.
+ 2. `assembly`, `isa`: produces assembly code.
+ 3. `binary`, `bin`: produces binaries.
+ 4. `fatbinary`, `fatbin`: produces fatbinaries.
+ 5. `binOrFatbin`: produces bins or fatbins, the target decides which.
}];
let options = [
Option<"offloadingHandler", "handler", "Attribute", "nullptr",
diff --git a/mlir/lib/Dialect/GPU/IR/GPUDialect.cpp b/mlir/lib/Dialect/GPU/IR/GPUDialect.cpp
index ad36b44763339f6..fde379cd0afe13f 100644
--- a/mlir/lib/Dialect/GPU/IR/GPUDialect.cpp
+++ b/mlir/lib/Dialect/GPU/IR/GPUDialect.cpp
@@ -1993,20 +1993,20 @@ gpu::SelectObjectAttr::verify(function_ref<InFlightDiagnostic()> emitError,
// GPU target options
//===----------------------------------------------------------------------===//
-TargetOptions::TargetOptions(StringRef toolkitPath,
- ArrayRef<std::string> linkFiles,
- StringRef cmdOptions,
- CompilationTarget compilationTarget)
+TargetOptions::TargetOptions(
+ StringRef toolkitPath, ArrayRef<std::string> linkFiles,
+ StringRef cmdOptions, CompilationTarget compilationTarget,
+ function_ref<SymbolTable *()> getSymbolTableCallback)
: TargetOptions(TypeID::get<TargetOptions>(), toolkitPath, linkFiles,
- cmdOptions, compilationTarget) {}
+ cmdOptions, compilationTarget, getSymbolTableCallback) {}
-TargetOptions::TargetOptions(TypeID typeID, StringRef toolkitPath,
- ArrayRef<std::string> linkFiles,
- StringRef cmdOptions,
- CompilationTarget compilationTarget)
+TargetOptions::TargetOptions(
+ TypeID typeID, StringRef toolkitPath, ArrayRef<std::string> linkFiles,
+ StringRef cmdOptions, CompilationTarget compilationTarget,
+ function_ref<SymbolTable *()> getSymbolTableCallback)
: toolkitPath(toolkitPath.str()), linkFiles(linkFiles),
cmdOptions(cmdOptions.str()), compilationTarget(compilationTarget),
- typeID(typeID) {}
+ getSymbolTableCallback(getSymbolTableCallback), typeID(typeID) {}
TypeID TargetOptions::getTypeID() const { return typeID; }
@@ -2016,6 +2016,10 @@ ArrayRef<std::string> TargetOptions::getLinkFiles() const { return linkFiles; }
StringRef TargetOptions::getCmdOptions() const { return cmdOptions; }
+SymbolTable *TargetOptions::getSymbolTable() const {
+ return getSymbolTableCallback ? getSymbolTableCallback() : nullptr;
+}
+
std::pair<llvm::BumpPtrAllocator, SmallVector<const char *>>
TargetOptions::tokenizeCmdOptions() const {
std::pair<llvm::BumpPtrAllocator, SmallVector<const char *>> options;
diff --git a/mlir/lib/Dialect/GPU/Transforms/ModuleToBinary.cpp b/mlir/lib/Dialect/GPU/Transforms/ModuleToBinary.cpp
index 06b7dee6941e1f4..e29a1f0c3248d04 100644
--- a/mlir/lib/Dialect/GPU/Transforms/ModuleToBinary.cpp
+++ b/mlir/lib/Dialect/GPU/Transforms/ModuleToBinary.cpp
@@ -66,9 +66,26 @@ void GpuModuleToBinaryPass::runOnOperation() {
.Default(-1);
if (targetFormat == -1)
getOperation()->emitError() << "Invalid format specified.";
+
+ // Lazy symbol table builder callback.
+ std::optional<SymbolTable> parentTable;
+ auto lazyTableBuilder = [&]() -> SymbolTable * {
+ // Build the table if it has not been built.
+ if (!parentTable) {
+ Operation *table = SymbolTable::getNearestSymbolTable(getOperation());
+ // It's up to the target attribute to determine if failing to find a
+ // symbol table is an error.
+ if (!table)
+ return nullptr;
+ parentTable = SymbolTable(table);
+ }
+ return &parentTable.value();
+ };
+
TargetOptions targetOptions(
toolkitPath, linkFiles, cmdOptions,
- static_cast<TargetOptions::CompilationTarget>(targetFormat));
+ static_cast<TargetOptions::CompilationTarget>(targetFormat),
+ lazyTableBuilder);
if (failed(transformGpuModulesToBinaries(
getOperation(),
offloadingHandler ? dyn_cast<OffloadingLLVMTranslationAttrInterface>(
More information about the Mlir-commits
mailing list