Skip to content

Commit 4c68f1a

Browse files
committed
[MLIR][NVVM] Add pmevent
Add nvvm.pmevent Op that Triggers one or more of a fixed number of performance monitor events, with event index or mask specified by immediate operand. [For more information, see PTX ISA](https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#miscellaneous-instructions-pmevent)
1 parent 69d0bd5 commit 4c68f1a

File tree

5 files changed

+100
-0
lines changed

5 files changed

+100
-0
lines changed

mlir/include/mlir/Dialect/LLVMIR/NVVMOps.td

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -401,6 +401,44 @@ def NVVM_ReduxOp :
401401
}];
402402
}
403403

404+
//===----------------------------------------------------------------------===//
405+
// NVVM Performance Monitor events
406+
//===----------------------------------------------------------------------===//
407+
408+
def NVVM_PMEventOp : NVVM_PTXBuilder_Op<"pmevent">,
409+
Arguments<(ins OptionalAttr<I16Attr>:$maskedEventId,
410+
OptionalAttr<I32Attr>:$eventId)> {
411+
let summary = "Trigger one or more Performance Monitor events.";
412+
413+
let description = [{
414+
Triggers one or more of a fixed number of performance monitor events, with
415+
event index or mask specified by immediate operand.
416+
417+
Without `mask` it triggers a single performance monitor event indexed by
418+
immediate operand a, in the range 0..15.
419+
420+
With `mask` it triggers one or more of the performance monitor events. Each
421+
bit in the 16-bit immediate operand a controls an event.
422+
423+
[For more information, see PTX ISA](https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#miscellaneous-instructions-pmevent)
424+
}];
425+
426+
string llvmBuilder = [{
427+
llvm::Value *mId = builder.getInt16(* $maskedEventId);
428+
createIntrinsicCall(builder, llvm::Intrinsic::nvvm_pm_event_mask, {mId});
429+
}];
430+
431+
let assemblyFormat = "attr-dict (`id` `=` $eventId^)? (`mask` `=` $maskedEventId^)?";
432+
433+
let extraClassDeclaration = [{
434+
bool hasIntrinsic() { if(getEventId()) return false; return true; }
435+
}];
436+
let extraClassDefinition = [{
437+
std::string $cppClass::getPtx() { return std::string("pmevent %0;"); }
438+
}];
439+
let hasVerifier = 1;
440+
}
441+
404442
//===----------------------------------------------------------------------===//
405443
// NVVM Split arrive/wait barrier
406444
//===----------------------------------------------------------------------===//

mlir/lib/Dialect/LLVMIR/IR/NVVMDialect.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,24 @@ LogicalResult BulkStoreOp::verify() {
189189
return success();
190190
}
191191

192+
LogicalResult PMEventOp::verify() {
193+
if (!getMaskedEventId() && !getEventId()) {
194+
return emitOpError() << "either `id` or `mask` must be set";
195+
}
196+
197+
if (getMaskedEventId() && getEventId()) {
198+
return emitOpError() << "`id` and `mask` cannot be set at the same time";
199+
}
200+
201+
if (getEventId()) {
202+
if (getEventId() < 0 || getEventId() > 15) {
203+
return emitOpError() << "`id` must be between 0 and 15";
204+
}
205+
}
206+
207+
return llvm::success();
208+
}
209+
192210
// Given the element type of an operand and whether or not it is an accumulator,
193211
// this function returns the PTX type (`NVVM::MMATypes`) that corresponds to the
194212
// operand's element type.

mlir/test/Conversion/NVVMToLLVM/nvvm-to-llvm.mlir

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -681,3 +681,17 @@ llvm.func @ex2(%input : f32, %pred : i1) {
681681
%1 = nvvm.inline_ptx "ex2.approx.ftz.f32 $0, $1;" (%input), predicate = %pred : f32, i1 -> f32
682682
llvm.return
683683
}
684+
685+
// -----
686+
687+
// CHECK-LABEL: @nvvm_pmevent
688+
llvm.func @nvvm_pmevent() {
689+
// CHECK: %[[S0:.+]] = llvm.mlir.constant(10 : i32) : i32
690+
// CHECK: llvm.inline_asm has_side_effects asm_dialect = att "pmevent $0;", "n" %[[S0]] : (i32) -> ()
691+
692+
nvvm.pmevent id = 10
693+
// CHECK: %[[S1:.+]] = llvm.mlir.constant(4 : i32) : i32
694+
// CHECK: llvm.inline_asm has_side_effects asm_dialect = att "pmevent $0;", "n" %[[S1]] : (i32) -> ()
695+
nvvm.pmevent id = 4
696+
llvm.return
697+
}

mlir/test/Target/LLVMIR/nvvmir-invalid.mlir

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,24 @@
11
// RUN: mlir-translate -verify-diagnostics -split-input-file -mlir-to-llvmir %s
22

3+
llvm.func @pmevent_no_id() {
4+
// expected-error @below {{either `id` or `mask` must be set}}
5+
nvvm.pmevent
6+
}
7+
8+
// -----
9+
10+
llvm.func @pmevent_bigger15() {
11+
// expected-error @below {{`id` must be between 0 and 15}}
12+
nvvm.pmevent id = 141
13+
}
14+
15+
// -----
16+
17+
llvm.func @pmevent_many_ids() {
18+
// expected-error @below {{`id` and `mask` cannot be set at the same time}}
19+
nvvm.pmevent id = 1 mask = 1
20+
}
21+
322
// -----
423

524
llvm.func @kernel_func(%numberOfThreads : i32) {

mlir/test/Target/LLVMIR/nvvmir.mlir

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -918,3 +918,14 @@ llvm.func @nvvm_dot_accumulate_2way(%a: vector<2xi16>, %b: vector<4xi8>, %c: i32
918918
%7 = nvvm.dot.accumulate.2way %a <signed>, %b <signed>, %c {b_hi = true}: vector<2xi16>, vector<4xi8>
919919
llvm.return
920920
}
921+
922+
// -----
923+
924+
// CHECK-LABEL: @nvvm_pmevent
925+
llvm.func @nvvm_pmevent() {
926+
// CHECK: call void @llvm.nvvm.pm.event.mask(i16 15000)
927+
nvvm.pmevent mask = 15000
928+
// CHECK: call void @llvm.nvvm.pm.event.mask(i16 4)
929+
nvvm.pmevent mask = 4
930+
llvm.return
931+
}

0 commit comments

Comments
 (0)