Skip to content

Commit 1d0723d

Browse files
authored
[MLIR][AMDGPU] Add amdgpu.sched_barrier (llvm#98911)
This commit adds sched_barrier operator to AMDGPU dialect that lowers to rocdl.sched.barrier.
1 parent 6b08e4d commit 1d0723d

File tree

4 files changed

+98
-2
lines changed

4 files changed

+98
-2
lines changed

mlir/include/mlir/Dialect/AMDGPU/IR/AMDGPU.td

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,46 @@ def AMDGPU_LDSBarrierOp : AMDGPU_Op<"lds_barrier"> {
433433
let assemblyFormat = "attr-dict";
434434
}
435435

436+
def AMDGPU_SchedBarrierOpOpt : I32BitEnumAttr<"sched_barrier_opt_enum",
437+
"The possible options for scheduling barriers",
438+
[
439+
I32BitEnumAttrCaseNone<"none">,
440+
I32BitEnumAttrCaseBit<"non_mem_non_sideffect", 0>,
441+
I32BitEnumAttrCaseBit<"valu", 1>,
442+
I32BitEnumAttrCaseBit<"salu", 2>,
443+
I32BitEnumAttrCaseBit<"mfma_wmma", 3>,
444+
I32BitEnumAttrCaseBit<"all_vmem", 4>,
445+
I32BitEnumAttrCaseBit<"vmem_read", 5>,
446+
I32BitEnumAttrCaseBit<"vmem_write", 6>,
447+
I32BitEnumAttrCaseBit<"all_ds", 7>,
448+
I32BitEnumAttrCaseBit<"ds_read", 8>,
449+
I32BitEnumAttrCaseBit<"ds_write", 9>,
450+
I32BitEnumAttrCaseBit<"transcendental", 10>
451+
]> {
452+
let genSpecializedAttr = 0;
453+
let cppNamespace = "::mlir::amdgpu";
454+
}
455+
456+
def AMDGPU_SchedBarrierOpOptAttr : EnumAttr<AMDGPU_Dialect, AMDGPU_SchedBarrierOpOpt,
457+
"sched_barrier_opt">{
458+
let assemblyFormat = "`<` $value `>`";
459+
}
460+
461+
def AMDGPU_SchedBarrierOp :
462+
AMDGPU_Op<"sched_barrier">,
463+
Arguments<(ins AMDGPU_SchedBarrierOpOptAttr:$opts)>
464+
{
465+
let summary = "Barrier that limits the backend scheduler of instruction movement";
466+
let description = [{
467+
`amdgpu.sched_barrier` serves as a barrier that could be
468+
configured to restrict movements of instructions through it as
469+
defined by sched_barrier_opts.
470+
}];
471+
let assemblyFormat = [{
472+
`allow` `=` $opts attr-dict
473+
}];
474+
}
475+
436476
def AMDGPU_MFMAPermB : I32EnumAttr<"MFMAPermB",
437477
"The possible permutations of the lanes storing B available in an MFMA",
438478
[

mlir/lib/Conversion/AMDGPUToROCDL/AMDGPUToROCDL.cpp

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,22 @@ struct LDSBarrierOpLowering : public ConvertOpToLLVMPattern<LDSBarrierOp> {
321321
return success();
322322
}
323323
};
324+
325+
struct SchedBarrierOpLowering : public ConvertOpToLLVMPattern<SchedBarrierOp> {
326+
SchedBarrierOpLowering(LLVMTypeConverter &converter, Chipset chipset)
327+
: ConvertOpToLLVMPattern<SchedBarrierOp>(converter), chipset(chipset) {}
328+
329+
Chipset chipset;
330+
331+
LogicalResult
332+
matchAndRewrite(SchedBarrierOp op, SchedBarrierOp::Adaptor adaptor,
333+
ConversionPatternRewriter &rewriter) const override {
334+
rewriter.replaceOpWithNewOp<ROCDL::SchedBarrier>(op,
335+
(uint32_t)op.getOpts());
336+
return success();
337+
}
338+
};
339+
324340
} // namespace
325341

326342
/// If `input` is a vector of bytes, concatentate those bytes in little-endian
@@ -879,8 +895,8 @@ void mlir::populateAMDGPUToROCDLConversionPatterns(LLVMTypeConverter &converter,
879895
ROCDL::RawPtrBufferAtomicUminOp>,
880896
RawBufferOpLowering<RawBufferAtomicCmpswapOp,
881897
ROCDL::RawPtrBufferAtomicCmpSwap>,
882-
LDSBarrierOpLowering, MFMAOpLowering, WMMAOpLowering,
883-
ExtPackedFp8OpLowering, PackedTrunc2xFp8OpLowering,
898+
LDSBarrierOpLowering, SchedBarrierOpLowering, MFMAOpLowering,
899+
WMMAOpLowering, ExtPackedFp8OpLowering, PackedTrunc2xFp8OpLowering,
884900
PackedStochRoundFp8OpLowering>(converter, chipset);
885901
}
886902

mlir/test/Conversion/AMDGPUToROCDL/amdgpu-to-rocdl.mlir

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,3 +226,34 @@ func.func @lds_barrier() {
226226
amdgpu.lds_barrier
227227
func.return
228228
}
229+
230+
// CHECK-LABEL: func @sched_barrier
231+
func.func @sched_barrier() {
232+
// CHECK: rocdl.sched.barrier 0
233+
amdgpu.sched_barrier allow = <none>
234+
// CHECK: rocdl.sched.barrier 1
235+
amdgpu.sched_barrier allow = <non_mem_non_sideffect>
236+
// CHECK: rocdl.sched.barrier 2
237+
amdgpu.sched_barrier allow = <valu>
238+
// CHECK: rocdl.sched.barrier 4
239+
amdgpu.sched_barrier allow = <salu>
240+
// CHECK: rocdl.sched.barrier 8
241+
amdgpu.sched_barrier allow = <mfma_wmma>
242+
// CHECK: rocdl.sched.barrier 16
243+
amdgpu.sched_barrier allow = <all_vmem>
244+
// CHECK: rocdl.sched.barrier 32
245+
amdgpu.sched_barrier allow = <vmem_read>
246+
// CHECK: rocdl.sched.barrier 64
247+
amdgpu.sched_barrier allow = <vmem_write>
248+
// CHECK: rocdl.sched.barrier 128
249+
amdgpu.sched_barrier allow = <all_ds>
250+
// CHECK: rocdl.sched.barrier 256
251+
amdgpu.sched_barrier allow = <ds_read>
252+
// CHECK: rocdl.sched.barrier 512
253+
amdgpu.sched_barrier allow = <ds_write>
254+
// CHECK: rocdl.sched.barrier 1024
255+
amdgpu.sched_barrier allow = <transcendental>
256+
// CHECK: rocdl.sched.barrier 18
257+
amdgpu.sched_barrier allow = <valu|all_vmem>
258+
func.return
259+
}

mlir/test/Dialect/AMDGPU/ops.mlir

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,15 @@ func.func @lds_barrier() {
109109
func.return
110110
}
111111

112+
// CHECK-LABEL: func @sched_barrier
113+
func.func @sched_barrier() {
114+
// CHECK: amdgpu.sched_barrier allow = <none>
115+
amdgpu.sched_barrier allow = <none>
116+
// CHECK: amdgpu.sched_barrier allow = <valu|all_vmem>
117+
amdgpu.sched_barrier allow = <valu|all_vmem>
118+
func.return
119+
}
120+
112121
// CHECK-LABEL: func @mfma
113122
func.func @mfma(%arg0 : f32, %arg1 : vector<32xf32>) -> vector<32xf32> {
114123
// CHECK: amdgpu.mfma

0 commit comments

Comments
 (0)