-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[MLIR][OpenMP] Lowering support for Order clause in SIMD directive #96866
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
@llvm/pr-subscribers-mlir @llvm/pr-subscribers-flang-openmp Author: None (harishch4) ChangesFull diff: https://github.com/llvm/llvm-project/pull/96866.diff 2 Files Affected:
diff --git a/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp b/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp
index eabc4b30f57a9..5b9457f860479 100644
--- a/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp
+++ b/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp
@@ -1543,7 +1543,9 @@ convertOmpSimd(Operation &opInst, llvm::IRBuilderBase &builder,
loopInfo, alignedVars,
simdOp.getIfExpr() ? moduleTranslation.lookupValue(simdOp.getIfExpr())
: nullptr,
- llvm::omp::OrderKind::OMP_ORDER_unknown, simdlen, safelen);
+ simdOp.getOrderVal() ? llvm::omp::OrderKind::OMP_ORDER_concurrent
+ : llvm::omp::OrderKind::OMP_ORDER_unknown,
+ simdlen, safelen);
builder.restoreIP(afterIP);
return success();
diff --git a/mlir/test/Target/LLVMIR/openmp-llvm.mlir b/mlir/test/Target/LLVMIR/openmp-llvm.mlir
index a1cc76f9ab770..5b68a25f218c3 100644
--- a/mlir/test/Target/LLVMIR/openmp-llvm.mlir
+++ b/mlir/test/Target/LLVMIR/openmp-llvm.mlir
@@ -826,6 +826,30 @@ llvm.func @simd_if(%arg0: !llvm.ptr {fir.bindc_name = "n"}, %arg1: !llvm.ptr {fi
// -----
+// CHECK-LABEL: @simd_order
+llvm.func @simd_order() {
+ %0 = llvm.mlir.constant(1 : i64) : i64
+ %1 = llvm.alloca %0 x i32 {bindc_name = "i", pinned} : (i64) -> !llvm.ptr
+ %2 = llvm.mlir.constant(1 : i64) : i64
+ %3 = llvm.alloca %2 x i32 {bindc_name = "i"} : (i64) -> !llvm.ptr
+ %4 = llvm.mlir.constant(1 : i32) : i32
+ %5 = llvm.mlir.constant(10 : i32) : i32
+ %6 = llvm.mlir.constant(1 : i32) : i32
+ omp.simd order(concurrent) safelen(2) {
+ omp.loop_nest (%arg0) : i32 = (%4) to (%5) inclusive step (%6) {
+ llvm.store %arg0, %1 : i32, !llvm.ptr
+ omp.yield
+ }
+ }
+ llvm.return
+}
+// If clause order(concurrent) is specified then the memory instructions
+// are marked parallel even if 'safelen' is finite.
+// CHECK: llvm.loop.parallel_accesses
+// CHECK-NEXT: llvm.loop.vectorize.enable
+// CHECK-NEXT: llvm.loop.vectorize.width{{.*}}i64 2
+// -----
+
llvm.func @body(i64)
llvm.func @test_omp_wsloop_ordered(%lb : i64, %ub : i64, %step : i64) -> () {
|
simdOp.getOrderVal() ? llvm::omp::OrderKind::OMP_ORDER_concurrent | ||
: llvm::omp::OrderKind::OMP_ORDER_unknown, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Isn't it technically possible to do omp.simd order(unknown) { ... }
? Maybe you can add a test for that and potentially modify this to make sure it works too.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Present implementation doesn't allow anything other than concurrent, example.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
A few minor comments.
llvm.func @simd_order() { | ||
%0 = llvm.mlir.constant(1 : i64) : i64 | ||
%1 = llvm.alloca %0 x i32 {bindc_name = "i", pinned} : (i64) -> !llvm.ptr | ||
%2 = llvm.mlir.constant(1 : i64) : i64 | ||
%3 = llvm.alloca %2 x i32 {bindc_name = "i"} : (i64) -> !llvm.ptr | ||
%4 = llvm.mlir.constant(1 : i32) : i32 | ||
%5 = llvm.mlir.constant(10 : i32) : i32 | ||
%6 = llvm.mlir.constant(1 : i32) : i32 | ||
omp.simd order(concurrent) safelen(2) { | ||
omp.loop_nest (%arg0) : i32 = (%4) to (%5) inclusive step (%6) { | ||
llvm.store %arg0, %1 : i32, !llvm.ptr | ||
omp.yield | ||
} | ||
} | ||
llvm.return | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You could simplify the test to something like.
llvm.func @simd_order() {
%0 = llvm.mlir.constant(10 : i64) : i64
%1 = llvm.mlir.constant(1 : i64) : i64
%2 = llvm.alloca %1 x i64 : (i64) -> !llvm.ptr
omp.simd order(concurrent) safelen(2) {
omp.loop_nest (%arg0) : i64 = (%1) to (%0) inclusive step (%1) {
llvm.store %arg0, %2 : i64, !llvm.ptr
omp.yield
}
}
llvm.return
}
simdOp.getOrderVal() ? llvm::omp::OrderKind::OMP_ORDER_concurrent | ||
: llvm::omp::OrderKind::OMP_ORDER_unknown, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I see that OrderVal is an enum (not a unit attribute) but only with a single value. Would it be better to have a switch so that any future updates will hit an error and not silently pass concurrent
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Okay, make sense.
} | ||
// If clause order(concurrent) is specified then the memory instructions | ||
// are marked parallel even if 'safelen' is finite. | ||
// CHECK: llvm.loop.parallel_accesses |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is it the parallel accesses that comes with concurrent
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, simliar to what clang is doing in CodeGenFunction::EmitOMPSimdInit().
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LG.
No description provided.