Skip to content

Commit 8f66794

Browse files
SusanTankcloudy0717
authored andcommitted
[acc] Add firstprivate/private/reduction to acc.kernels (llvm#170387)
Similar to llvm#161881, we will need private/firstprivate/reduction representation for acc kernels for automatic privatization
1 parent 91ff144 commit 8f66794

File tree

4 files changed

+127
-12
lines changed

4 files changed

+127
-12
lines changed

flang/lib/Lower/OpenACC.cpp

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3024,11 +3024,9 @@ static Op createComputeOp(
30243024
}
30253025
addOperand(operands, operandSegments, ifCond);
30263026
addOperand(operands, operandSegments, selfCond);
3027-
if constexpr (!std::is_same_v<Op, mlir::acc::KernelsOp>) {
3028-
addOperands(operands, operandSegments, reductionOperands);
3029-
addOperands(operands, operandSegments, privateOperands);
3030-
addOperands(operands, operandSegments, firstprivateOperands);
3031-
}
3027+
addOperands(operands, operandSegments, reductionOperands);
3028+
addOperands(operands, operandSegments, privateOperands);
3029+
addOperands(operands, operandSegments, firstprivateOperands);
30323030
addOperands(operands, operandSegments, dataClauseOperands);
30333031

30343032
Op computeOp;

mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2002,8 +2002,7 @@ def OpenACC_KernelsOp : OpenACC_Op<"kernels",
20022002
corresponding `device_type` attributes must be modified as well.
20032003
}];
20042004

2005-
let arguments = (ins
2006-
Variadic<IntOrIndex>:$asyncOperands,
2005+
let arguments = (ins Variadic<IntOrIndex>:$asyncOperands,
20072006
OptionalAttr<DeviceTypeArrayAttr>:$asyncOperandsDeviceType,
20082007
OptionalAttr<DeviceTypeArrayAttr>:$asyncOnly,
20092008
Variadic<IntOrIndex>:$waitOperands,
@@ -2018,12 +2017,12 @@ def OpenACC_KernelsOp : OpenACC_Op<"kernels",
20182017
OptionalAttr<DeviceTypeArrayAttr>:$numWorkersDeviceType,
20192018
Variadic<IntOrIndex>:$vectorLength,
20202019
OptionalAttr<DeviceTypeArrayAttr>:$vectorLengthDeviceType,
2021-
Optional<I1>:$ifCond,
2022-
Optional<I1>:$selfCond,
2023-
UnitAttr:$selfAttr,
2020+
Optional<I1>:$ifCond, Optional<I1>:$selfCond, UnitAttr:$selfAttr,
2021+
Variadic<OpenACC_AnyPointerOrMappableType>:$reductionOperands,
2022+
Variadic<OpenACC_AnyPointerOrMappableType>:$privateOperands,
2023+
Variadic<OpenACC_AnyPointerOrMappableType>:$firstprivateOperands,
20242024
Variadic<OpenACC_AnyPointerOrMappableType>:$dataClauseOperands,
2025-
OptionalAttr<DefaultValueAttr>:$defaultAttr,
2026-
UnitAttr:$combined);
2025+
OptionalAttr<DefaultValueAttr>:$defaultAttr, UnitAttr:$combined);
20272026

20282027
let regions = (region AnyRegion:$region);
20292028

@@ -2111,6 +2110,18 @@ def OpenACC_KernelsOp : OpenACC_Op<"kernels",
21112110
/// types.
21122111
void addWaitOperands(MLIRContext *, bool hasDevnum, mlir::ValueRange,
21132112
llvm::ArrayRef<DeviceType>);
2113+
2114+
/// Adds a private clause variable to this operation, including its recipe.
2115+
void addPrivatization(MLIRContext *, mlir::acc::PrivateOp op,
2116+
mlir::acc::PrivateRecipeOp recipe);
2117+
/// Adds a firstprivate clause variable to this operation, including its
2118+
/// recipe.
2119+
void addFirstPrivatization(MLIRContext *, mlir::acc::FirstprivateOp op,
2120+
mlir::acc::FirstprivateRecipeOp recipe);
2121+
/// Adds a reduction clause variable to this operation, including its
2122+
/// recipe.
2123+
void addReduction(MLIRContext *, mlir::acc::ReductionOp op,
2124+
mlir::acc::ReductionRecipeOp recipe);
21142125
}];
21152126

21162127
let assemblyFormat = [{
@@ -2119,17 +2130,20 @@ def OpenACC_KernelsOp : OpenACC_Op<"kernels",
21192130
`dataOperands` `(` $dataClauseOperands `:` type($dataClauseOperands) `)`
21202131
| `async` `` custom<DeviceTypeOperandsWithKeywordOnly>($asyncOperands,
21212132
type($asyncOperands), $asyncOperandsDeviceType, $asyncOnly)
2133+
| `firstprivate` `(` $firstprivateOperands `:` type($firstprivateOperands) `)`
21222134
| `num_gangs` `(` custom<NumGangs>($numGangs,
21232135
type($numGangs), $numGangsDeviceType, $numGangsSegments) `)`
21242136
| `num_workers` `(` custom<DeviceTypeOperands>($numWorkers,
21252137
type($numWorkers), $numWorkersDeviceType) `)`
2138+
| `private` `(` $privateOperands `:` type($privateOperands) `)`
21262139
| `vector_length` `(` custom<DeviceTypeOperands>($vectorLength,
21272140
type($vectorLength), $vectorLengthDeviceType) `)`
21282141
| `wait` `` custom<WaitClause>($waitOperands, type($waitOperands),
21292142
$waitOperandsDeviceType, $waitOperandsSegments, $hasWaitDevnum,
21302143
$waitOnly)
21312144
| `self` `(` $selfCond `)`
21322145
| `if` `(` $ifCond `)`
2146+
| `reduction` `(` $reductionOperands `:` type($reductionOperands) `)`
21332147
)
21342148
$region attr-dict-with-keyword
21352149
}];

mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2675,6 +2675,27 @@ LogicalResult acc::KernelsOp::verify() {
26752675
return checkDataOperands<acc::KernelsOp>(*this, getDataClauseOperands());
26762676
}
26772677

2678+
void acc::KernelsOp::addPrivatization(MLIRContext *context,
2679+
mlir::acc::PrivateOp op,
2680+
mlir::acc::PrivateRecipeOp recipe) {
2681+
op.setRecipeAttr(mlir::SymbolRefAttr::get(context, recipe.getSymName()));
2682+
getPrivateOperandsMutable().append(op.getResult());
2683+
}
2684+
2685+
void acc::KernelsOp::addFirstPrivatization(
2686+
MLIRContext *context, mlir::acc::FirstprivateOp op,
2687+
mlir::acc::FirstprivateRecipeOp recipe) {
2688+
op.setRecipeAttr(mlir::SymbolRefAttr::get(context, recipe.getSymName()));
2689+
getFirstprivateOperandsMutable().append(op.getResult());
2690+
}
2691+
2692+
void acc::KernelsOp::addReduction(MLIRContext *context,
2693+
mlir::acc::ReductionOp op,
2694+
mlir::acc::ReductionRecipeOp recipe) {
2695+
op.setRecipeAttr(mlir::SymbolRefAttr::get(context, recipe.getSymName()));
2696+
getReductionOperandsMutable().append(op.getResult());
2697+
}
2698+
26782699
void acc::KernelsOp::addNumWorkersOperand(
26792700
MLIRContext *context, mlir::Value newValue,
26802701
llvm::ArrayRef<DeviceType> effectiveDeviceTypes) {

mlir/test/Dialect/OpenACC/ops.mlir

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -731,6 +731,59 @@ func.func @testserialop(%a: memref<10xf32>, %b: memref<10xf32>, %c: memref<10x10
731731

732732
// -----
733733

734+
// Test acc.kernels with private and firstprivate operands, similar to acc.serial.
735+
736+
acc.private.recipe @privatization_memref_10_f32 : memref<10xf32> init {
737+
^bb0(%arg0: memref<10xf32>):
738+
%0 = memref.alloc() : memref<10xf32>
739+
acc.yield %0 : memref<10xf32>
740+
} destroy {
741+
^bb0(%arg0: memref<10xf32>):
742+
memref.dealloc %arg0 : memref<10xf32>
743+
acc.terminator
744+
}
745+
746+
acc.private.recipe @privatization_memref_10_10_f32 : memref<10x10xf32> init {
747+
^bb0(%arg0: memref<10x10xf32>):
748+
%1 = memref.alloc() : memref<10x10xf32>
749+
acc.yield %1 : memref<10x10xf32>
750+
} destroy {
751+
^bb0(%arg0: memref<10x10xf32>):
752+
memref.dealloc %arg0 : memref<10x10xf32>
753+
acc.terminator
754+
}
755+
756+
acc.firstprivate.recipe @firstprivatization_memref_10xf32 : memref<10xf32> init {
757+
^bb0(%arg0: memref<10xf32>):
758+
%2 = memref.alloca() : memref<10xf32>
759+
acc.yield %2 : memref<10xf32>
760+
} copy {
761+
^bb0(%arg0: memref<10xf32>, %arg1: memref<10xf32>):
762+
memref.copy %arg0, %arg1 : memref<10xf32> to memref<10xf32>
763+
acc.terminator
764+
} destroy {
765+
^bb0(%arg0: memref<10xf32>):
766+
acc.terminator
767+
}
768+
769+
func.func @testkernelspriv(%a: memref<10xf32>, %b: memref<10xf32>, %c: memref<10x10xf32>) -> () {
770+
%priv_a = acc.private varPtr(%a : memref<10xf32>) recipe(@privatization_memref_10_f32) -> memref<10xf32>
771+
%priv_c = acc.private varPtr(%c : memref<10x10xf32>) recipe(@privatization_memref_10_10_f32) -> memref<10x10xf32>
772+
%firstp = acc.firstprivate varPtr(%b : memref<10xf32>) varType(tensor<10xf32>) recipe(@firstprivatization_memref_10xf32) -> memref<10xf32>
773+
acc.kernels firstprivate(%firstp : memref<10xf32>) private(%priv_a, %priv_c : memref<10xf32>, memref<10x10xf32>) {
774+
}
775+
return
776+
}
777+
778+
// CHECK-LABEL: func.func @testkernelspriv(
779+
// CHECK: %[[PRIV_A:.*]] = acc.private varPtr(%{{.*}} : memref<10xf32>) recipe(@privatization_memref_10_f32) -> memref<10xf32>
780+
// CHECK: %[[PRIV_C:.*]] = acc.private varPtr(%{{.*}} : memref<10x10xf32>) recipe(@privatization_memref_10_10_f32) -> memref<10x10xf32>
781+
// CHECK: %[[FIRSTP:.*]] = acc.firstprivate varPtr(%{{.*}} : memref<10xf32>) varType(tensor<10xf32>) recipe(@firstprivatization_memref_10xf32) -> memref<10xf32>
782+
// CHECK: acc.kernels firstprivate(%[[FIRSTP]] : memref<10xf32>) private(%[[PRIV_A]], %[[PRIV_C]] : memref<10xf32>, memref<10x10xf32>) {
783+
// CHECK-NEXT: }
784+
785+
// -----
786+
734787
func.func @testdataop(%a: memref<f32>, %b: memref<f32>, %c: memref<f32>) -> () {
735788
%ifCond = arith.constant true
736789

@@ -1602,6 +1655,35 @@ func.func @acc_reduc_test(%a : memref<i64>) -> () {
16021655

16031656
// -----
16041657

1658+
acc.reduction.recipe @reduction_add_memref_i64 : memref<i64> reduction_operator <add> init {
1659+
^bb0(%arg0: memref<i64>):
1660+
%c0_i64 = arith.constant 0 : i64
1661+
%alloca = memref.alloca() : memref<i64>
1662+
memref.store %c0_i64, %alloca[] : memref<i64>
1663+
acc.yield %alloca : memref<i64>
1664+
} combiner {
1665+
^bb0(%arg0: memref<i64>, %arg1: memref<i64>):
1666+
%0 = memref.load %arg0[] : memref<i64>
1667+
%1 = memref.load %arg1[] : memref<i64>
1668+
%2 = arith.addi %0, %1 : i64
1669+
memref.store %2, %arg0[] : memref<i64>
1670+
acc.yield %arg0 : memref<i64>
1671+
}
1672+
1673+
func.func @acc_kernels_reduc_test(%a : memref<i64>) -> () {
1674+
%reduction_a = acc.reduction varPtr(%a : memref<i64>) recipe(@reduction_add_memref_i64) -> memref<i64>
1675+
acc.kernels reduction(%reduction_a : memref<i64>) {
1676+
}
1677+
return
1678+
}
1679+
1680+
// CHECK-LABEL: func.func @acc_kernels_reduc_test(
1681+
// CHECK-SAME: %[[ARG0:.*]]: memref<i64>)
1682+
// CHECK: %[[REDUCTION_A:.*]] = acc.reduction varPtr(%[[ARG0]] : memref<i64>) recipe(@reduction_add_memref_i64) -> memref<i64>
1683+
// CHECK-NEXT: acc.kernels reduction(%[[REDUCTION_A]] : memref<i64>)
1684+
1685+
// -----
1686+
16051687
func.func @testdeclareop(%a: memref<f32>, %b: memref<f32>, %c: memref<f32>) -> () {
16061688
%0 = acc.copyin varPtr(%a : memref<f32>) -> memref<f32>
16071689
// copyin(zero)

0 commit comments

Comments
 (0)