From e3d3e75892da961c16f701869780c95676fc49b9 Mon Sep 17 00:00:00 2001 From: Fabian Mora Date: Thu, 13 Jun 2024 20:32:57 +0000 Subject: [PATCH] [mlir][gpu] Add builder to `gpu.launch_func` --- mlir/include/mlir/Dialect/GPU/IR/GPUOps.td | 6 ++++++ mlir/lib/Dialect/GPU/IR/GPUDialect.cpp | 23 +++++++++++++++++----- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/mlir/include/mlir/Dialect/GPU/IR/GPUOps.td b/mlir/include/mlir/Dialect/GPU/IR/GPUOps.td index 9c5f7ecd8cbe85..5943de103beba6 100644 --- a/mlir/include/mlir/Dialect/GPU/IR/GPUOps.td +++ b/mlir/include/mlir/Dialect/GPU/IR/GPUOps.td @@ -653,6 +653,12 @@ def GPU_LaunchFuncOp :GPU_Op<"launch_func", [ CArg<"Type", "nullptr">:$asyncTokenType, CArg<"ValueRange", "{}">:$asyncDependencies, CArg<"std::optional", "std::nullopt">:$clusterSize)>, + OpBuilder<(ins "SymbolRefAttr":$kernel, "KernelDim3":$gridSize, + "KernelDim3":$blockSize, "Value":$dynamicSharedMemorySize, + "ValueRange":$kernelOperands, + "Type":$asyncTokenType, + CArg<"ValueRange", "{}">:$asyncDependencies, + CArg<"std::optional", "std::nullopt">:$clusterSize)>, OpBuilder<(ins "SymbolRefAttr":$kernel, "KernelDim3":$gridSize, "KernelDim3":$blockSize, "Value":$dynamicSharedMemorySize, "ValueRange":$kernelOperands, diff --git a/mlir/lib/Dialect/GPU/IR/GPUDialect.cpp b/mlir/lib/Dialect/GPU/IR/GPUDialect.cpp index d8e29da6512d4e..17bf254b64b4da 100644 --- a/mlir/lib/Dialect/GPU/IR/GPUDialect.cpp +++ b/mlir/lib/Dialect/GPU/IR/GPUDialect.cpp @@ -1081,11 +1081,13 @@ BlockArgument LaunchOp::addPrivateAttribution(Type type, Location loc) { //===----------------------------------------------------------------------===// void LaunchFuncOp::build(OpBuilder &builder, OperationState &result, - GPUFuncOp kernelFunc, KernelDim3 gridSize, + SymbolRefAttr kernelSymbol, KernelDim3 gridSize, KernelDim3 getBlockSize, Value dynamicSharedMemorySize, ValueRange kernelOperands, Type asyncTokenType, ValueRange asyncDependencies, std::optional clusterSize) { + assert(kernelSymbol.getNestedReferences().size() == 1 && + "expected a symbol reference with a single nested reference"); result.addOperands(asyncDependencies); if (asyncTokenType) result.types.push_back(builder.getType()); @@ -1098,10 +1100,6 @@ void LaunchFuncOp::build(OpBuilder &builder, OperationState &result, if (dynamicSharedMemorySize) result.addOperands(dynamicSharedMemorySize); result.addOperands(kernelOperands); - auto kernelModule = kernelFunc->getParentOfType(); - auto kernelSymbol = - SymbolRefAttr::get(kernelModule.getNameAttr(), - {SymbolRefAttr::get(kernelFunc.getNameAttr())}); Properties &prop = result.getOrAddProperties(); prop.kernel = kernelSymbol; @@ -1122,6 +1120,21 @@ void LaunchFuncOp::build(OpBuilder &builder, OperationState &result, prop.operandSegmentSizes[segmentSizesLen - 1] = 0; } +void LaunchFuncOp::build(OpBuilder &builder, OperationState &result, + GPUFuncOp kernelFunc, KernelDim3 gridSize, + KernelDim3 getBlockSize, Value dynamicSharedMemorySize, + ValueRange kernelOperands, Type asyncTokenType, + ValueRange asyncDependencies, + std::optional clusterSize) { + auto kernelModule = kernelFunc->getParentOfType(); + auto kernelSymbol = + SymbolRefAttr::get(kernelModule.getNameAttr(), + {SymbolRefAttr::get(kernelFunc.getNameAttr())}); + build(builder, result, kernelSymbol, gridSize, getBlockSize, + dynamicSharedMemorySize, kernelOperands, asyncTokenType, + asyncDependencies, clusterSize); +} + void LaunchFuncOp::build(OpBuilder &builder, OperationState &result, SymbolRefAttr kernel, KernelDim3 gridSize, KernelDim3 getBlockSize, Value dynamicSharedMemorySize,