[Mlir-commits] [mlir] 9f864a5 - [mlir][gpu] Introduce gpu.global_id op
Ivan Butygin
llvmlistbot at llvm.org
Tue Mar 15 03:28:04 PDT 2022
Author: Ivan Butygin
Date: 2022-03-15T13:25:50+03:00
New Revision: 9f864a5447503d54d576736e2e095e145edc01f8
URL: https://github.com/llvm/llvm-project/commit/9f864a5447503d54d576736e2e095e145edc01f8
DIFF: https://github.com/llvm/llvm-project/commit/9f864a5447503d54d576736e2e095e145edc01f8.diff
LOG: [mlir][gpu] Introduce gpu.global_id op
Introduce OpenCL-style global_id op and corresponding spirv lowering.
Differential Revision: https://reviews.llvm.org/D121548
Added:
Modified:
mlir/include/mlir/Dialect/GPU/GPUOps.td
mlir/lib/Conversion/GPUToSPIRV/GPUToSPIRV.cpp
mlir/test/Conversion/GPUToSPIRV/builtins.mlir
mlir/test/Dialect/GPU/ops.mlir
Removed:
################################################################################
diff --git a/mlir/include/mlir/Dialect/GPU/GPUOps.td b/mlir/include/mlir/Dialect/GPU/GPUOps.td
index 2976ee37e5577..4b07d24f95260 100644
--- a/mlir/include/mlir/Dialect/GPU/GPUOps.td
+++ b/mlir/include/mlir/Dialect/GPU/GPUOps.td
@@ -112,6 +112,21 @@ def GPU_SubgroupIdOp : GPU_Op<"subgroup_id", [NoSideEffect]>,
let assemblyFormat = "attr-dict `:` type($result)";
}
+def GPU_GlobalIdOp : GPU_IndexOp<"global_id"> {
+ let description = [{
+ Returns the unique global workitem/thread id, i.e., the unique index of the
+ current workitem/thread within all workgroups / grid along the x, y, or z
+ `dimension`.
+
+ Example:
+
+ ```mlir
+ %gidX = gpu.global_id x
+ ```
+ }];
+}
+
+
def GPU_NumSubgroupsOp : GPU_Op<"num_subgroups", [NoSideEffect]>,
Arguments<(ins)>, Results<(outs Index:$result)> {
let description = [{
diff --git a/mlir/lib/Conversion/GPUToSPIRV/GPUToSPIRV.cpp b/mlir/lib/Conversion/GPUToSPIRV/GPUToSPIRV.cpp
index 546b0ac38f8d1..866d087dd1747 100644
--- a/mlir/lib/Conversion/GPUToSPIRV/GPUToSPIRV.cpp
+++ b/mlir/lib/Conversion/GPUToSPIRV/GPUToSPIRV.cpp
@@ -373,6 +373,8 @@ void mlir::populateGPUToSPIRVPatterns(SPIRVTypeConverter &typeConverter,
LaunchConfigConversion<gpu::BlockDimOp, spirv::BuiltIn::WorkgroupSize>,
LaunchConfigConversion<gpu::ThreadIdOp,
spirv::BuiltIn::LocalInvocationId>,
+ LaunchConfigConversion<gpu::GlobalIdOp,
+ spirv::BuiltIn::GlobalInvocationId>,
SingleDimLaunchConfigConversion<gpu::SubgroupIdOp,
spirv::BuiltIn::SubgroupId>,
SingleDimLaunchConfigConversion<gpu::NumSubgroupsOp,
diff --git a/mlir/test/Conversion/GPUToSPIRV/builtins.mlir b/mlir/test/Conversion/GPUToSPIRV/builtins.mlir
index edbd9839ce692..1481c5e25482e 100644
--- a/mlir/test/Conversion/GPUToSPIRV/builtins.mlir
+++ b/mlir/test/Conversion/GPUToSPIRV/builtins.mlir
@@ -293,6 +293,79 @@ module attributes {gpu.container_module} {
}
}
+// -----
+
+module attributes {gpu.container_module} {
+ func @builtin() {
+ %c0 = arith.constant 1 : index
+ gpu.launch_func @kernels::@builtin_global_id_x
+ blocks in (%c0, %c0, %c0) threads in (%c0, %c0, %c0)
+ return
+ }
+
+ // CHECK-LABEL: spv.module @{{.*}} Logical GLSL450
+ // CHECK: spv.GlobalVariable [[GLOBALINVOCATIONID:@.*]] built_in("GlobalInvocationId")
+ gpu.module @kernels {
+ gpu.func @builtin_global_id_x() kernel
+ attributes {spv.entry_point_abi = {local_size = dense<[16, 1, 1]>: vector<3xi32>}} {
+ // CHECK: [[ADDRESS:%.*]] = spv.mlir.addressof [[GLOBALINVOCATIONID]]
+ // CHECK-NEXT: [[VEC:%.*]] = spv.Load "Input" [[ADDRESS]]
+ // CHECK-NEXT: {{%.*}} = spv.CompositeExtract [[VEC]]{{\[}}0 : i32{{\]}}
+ %0 = gpu.global_id x
+ gpu.return
+ }
+ }
+}
+
+// -----
+
+module attributes {gpu.container_module} {
+ func @builtin() {
+ %c0 = arith.constant 1 : index
+ gpu.launch_func @kernels::@builtin_global_id_y
+ blocks in (%c0, %c0, %c0) threads in (%c0, %c0, %c0)
+ return
+ }
+
+ // CHECK-LABEL: spv.module @{{.*}} Logical GLSL450
+ // CHECK: spv.GlobalVariable [[GLOBALINVOCATIONID:@.*]] built_in("GlobalInvocationId")
+ gpu.module @kernels {
+ gpu.func @builtin_global_id_y() kernel
+ attributes {spv.entry_point_abi = {local_size = dense<[16, 1, 1]>: vector<3xi32>}} {
+ // CHECK: [[ADDRESS:%.*]] = spv.mlir.addressof [[GLOBALINVOCATIONID]]
+ // CHECK-NEXT: [[VEC:%.*]] = spv.Load "Input" [[ADDRESS]]
+ // CHECK-NEXT: {{%.*}} = spv.CompositeExtract [[VEC]]{{\[}}1 : i32{{\]}}
+ %0 = gpu.global_id y
+ gpu.return
+ }
+ }
+}
+
+// -----
+
+module attributes {gpu.container_module} {
+ func @builtin() {
+ %c0 = arith.constant 1 : index
+ gpu.launch_func @kernels::@builtin_global_id_z
+ blocks in (%c0, %c0, %c0) threads in (%c0, %c0, %c0)
+ return
+ }
+
+ // CHECK-LABEL: spv.module @{{.*}} Logical GLSL450
+ // CHECK: spv.GlobalVariable [[GLOBALINVOCATIONID:@.*]] built_in("GlobalInvocationId")
+ gpu.module @kernels {
+ gpu.func @builtin_global_id_z() kernel
+ attributes {spv.entry_point_abi = {local_size = dense<[16, 1, 1]>: vector<3xi32>}} {
+ // CHECK: [[ADDRESS:%.*]] = spv.mlir.addressof [[GLOBALINVOCATIONID]]
+ // CHECK-NEXT: [[VEC:%.*]] = spv.Load "Input" [[ADDRESS]]
+ // CHECK-NEXT: {{%.*}} = spv.CompositeExtract [[VEC]]{{\[}}2 : i32{{\]}}
+ %0 = gpu.global_id z
+ gpu.return
+ }
+ }
+}
+
+
// -----
module attributes {gpu.container_module} {
diff --git a/mlir/test/Dialect/GPU/ops.mlir b/mlir/test/Dialect/GPU/ops.mlir
index c317dbc930480..e0f949a8df2b9 100644
--- a/mlir/test/Dialect/GPU/ops.mlir
+++ b/mlir/test/Dialect/GPU/ops.mlir
@@ -44,6 +44,10 @@ module attributes {gpu.container_module} {
%gDimY = gpu.grid_dim y
%gDimZ = gpu.grid_dim z
+ %gIdX = gpu.global_id x
+ %gIdY = gpu.global_id y
+ %gIdZ = gpu.global_id z
+
%sgId = gpu.subgroup_id : index
%numSg = gpu.num_subgroups : index
%SgSi = gpu.subgroup_size : index
More information about the Mlir-commits
mailing list