-
Notifications
You must be signed in to change notification settings - Fork 15.4k
[mlir][linalg] Fix padding shape computation in PadTilingInterface for convs #149576
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
Changes from 1 commit
a0b980a
01f2f3a
79e5629
735085a
8b22d7e
f494302
3676d4d
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -52,22 +52,22 @@ module { | |
|
|
||
| // CHECK-LABEL: @generic | ||
| // CHECK-SAME: %[[T0:.*]]: tensor<7x5xf32>, | ||
| // CHECK-SAME: %[[T1:.*]]: tensor<7x11x12xf32>) | ||
| func.func @generic(%arg0: tensor<7x5xf32>, %arg1: tensor<7x11x12xf32>) -> tensor<7x11x12xf32> { | ||
| // CHECK-SAME: %[[T1:.*]]: tensor<7x11x11xf32>) | ||
| func.func @generic(%arg0: tensor<7x5xf32>, %arg1: tensor<7x11x11xf32>) -> tensor<7x11x11xf32> { | ||
|
|
||
| // CHECK-DAG: %[[CST:.*]] = arith.constant 0. | ||
|
|
||
| // CHECK: %[[PAD0:.*]] = tensor.pad %[[T0]] low[0, 0] high[2, 0] | ||
| // CHECK: : tensor<7x5xf32> to tensor<9x5xf32> | ||
| // CHECK: %[[PAD1:.*]] = tensor.pad %[[T1]] low[0, 0, 0] high[2, 4, 2] { | ||
| // CHECK: : tensor<7x11x12xf32> to tensor<9x15x14xf32> | ||
| // CHECK: : tensor<7x11x11xf32> to tensor<9x15x13xf32> | ||
| // CHECK-NEXT: linalg.generic | ||
| // CHECK: tensor.extract_slice %{{.*}}[0, 0, 0] [7, 11, 12] [1, 1, 1] : tensor<9x15x14xf32> to tensor<7x11x12xf32> | ||
| %0 = linalg.generic {indexing_maps = [#map, #map1], iterator_types = ["parallel", "parallel", "reduction"]} ins(%arg0 : tensor<7x5xf32>) outs(%arg1 : tensor<7x11x12xf32>) { | ||
| // CHECK: tensor.extract_slice %{{.*}}[0, 0, 0] [7, 11, 11] [1, 1, 1] : tensor<9x15x13xf32> to tensor<7x11x11xf32> | ||
| %0 = linalg.generic {indexing_maps = [#map, #map1], iterator_types = ["parallel", "parallel", "reduction"]} ins(%arg0 : tensor<7x5xf32>) outs(%arg1 : tensor<7x11x11xf32>) { | ||
| ^bb0(%in: f32, %out: f32): | ||
| linalg.yield %in : f32 | ||
| } -> tensor<7x11x12xf32> | ||
| return %0 : tensor<7x11x12xf32> | ||
|
Comment on lines
-55
to
-70
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Why was this changed? |
||
| } -> tensor<7x11x11xf32> | ||
| return %0 : tensor<7x11x11xf32> | ||
| } | ||
| module attributes {transform.with_named_sequence} { | ||
| transform.named_sequence @__transform_main(%arg0: !transform.any_op {transform.readonly}) { | ||
|
|
@@ -83,7 +83,7 @@ module { | |
| // ----- | ||
|
|
||
| // CHECK-DAG: #[[$MAP0:.*]] = affine_map<()[s0, s1] -> (-s1 + (s0 ceildiv 3) * 3)> | ||
| // CHECK-DAG: #[[$MAP1:.*]] = affine_map<()[s0, s1] -> (-s1 + (s0 ceildiv 3) * 3 + 5)> | ||
| // CHECK-DAG: #[[$MAP1:.*]] = affine_map<()[s0, s1] -> (-s1 + (s0 ceildiv 3) * 3 + 4)> | ||
| // CHECK-DAG: #[[$MAP2:.*]] = affine_map<()[s0] -> (s0 + 5)> | ||
|
|
||
| #map = affine_map<(d0, d1, d2) -> (d0, d1)> | ||
|
|
@@ -272,3 +272,74 @@ module attributes {transform.with_named_sequence} { | |
| } | ||
| } | ||
|
|
||
| // ----- | ||
|
|
||
| // CHECK-LABEL: pad_conv | ||
| func.func @pad_conv(%arg0: tensor<1x16x16x4xf32>, %arg1: tensor<16x3x3x4xf32>, %arg2: tensor<1x14x14x16xf32>) -> tensor<1x14x14x16xf32> { | ||
|
|
||
| // CHECK: tensor.pad %{{.*}} low[0, 0, 0, 0] high[0, 0, 2, 12] | ||
| // CHECK: : tensor<1x16x16x4xf32> to tensor<1x16x18x16xf32> | ||
| // CHECK: tensor.pad %{{.*}} low[0, 0, 0, 0] high[0, 0, 0, 12] | ||
| // CHECK: : tensor<16x3x3x4xf32> to tensor<16x3x3x16xf32> | ||
| // CHECK: tensor.pad %{{.*}} low[0, 0, 0, 0] high[0, 0, 2, 0] | ||
| // CHECK: : tensor<1x14x14x16xf32> to tensor<1x14x16x16xf32> | ||
| // CHECK-NEXT: linalg.conv_2d_nhwc_fhwc | ||
| // CHECK: tensor.extract_slice %{{.*}}[0, 0, 0, 0] [1, 14, 14, 16] [1, 1, 1, 1] : tensor<1x14x16x16xf32> to tensor<1x14x14x16xf32> | ||
|
|
||
| %0 = linalg.conv_2d_nhwc_fhwc | ||
| {dilations = dense<1> : tensor<2xi64>, strides = dense<1> : tensor<2xi64> } | ||
| ins(%arg0, %arg1: tensor<1x16x16x4xf32>, tensor<16x3x3x4xf32>) | ||
| outs(%arg2: tensor<1x14x14x16xf32>) -> tensor<1x14x14x16xf32> | ||
| return %0 : tensor<1x14x14x16xf32> | ||
| } | ||
|
|
||
| module attributes {transform.with_named_sequence} { | ||
| transform.named_sequence @__transform_main(%arg1: !transform.any_op {transform.readonly}) { | ||
| %0 = transform.structured.match ops{["linalg.conv_2d_nhwc_fhwc"]} in %arg1 : (!transform.any_op) -> !transform.any_op | ||
| %padded, %pad = transform.structured.pad_tiling_interface %0 to padding_sizes [0, 0, 16, 0, 0, 0, 16] pad_to_multiple_of { | ||
| padding_values = [0.0 : f32, 0.0 : f32, 0.0 : f32, 0.0 : f32, 0.0 : f32, 0.0 : f32, 0.0 : f32] | ||
| } : (!transform.any_op) -> (!transform.any_op, !transform.any_op) | ||
| transform.yield | ||
| } | ||
| } | ||
|
|
||
| // ----- | ||
|
|
||
| // CHECK-DAG: #[[$MAP0:.*]] = affine_map<()[s0, s1] -> (-s1 + (s0 ceildiv 16) * 16 + 2)> | ||
| // CHECK-DAG: #[[$MAP1:.*]] = affine_map<()[s0, s1] -> (-s1 + (s0 ceildiv 16) * 16)> | ||
|
|
||
| // CHECK-LABEL: pad_conv_dynamic | ||
| func.func @pad_conv_dynamic(%arg0: tensor<1x16x?x4xf32>, %arg1: tensor<16x3x3x4xf32>, %arg2: tensor<1x14x?x16xf32>) -> tensor<1x14x?x16xf32> { | ||
|
|
||
| // CHECK-DAG: %[[C2:.*]] = arith.constant 2 : index | ||
| // CHECK: %[[D0_0:.*]] = tensor.dim %{{.*}}, %[[C2]] : tensor<1x14x?x16xf32> | ||
| // CHECK: %[[D0_1:.*]] = tensor.dim %{{.*}}, %[[C2]] : tensor<1x16x?x4xf32> | ||
| // CHECK: %[[H0:.*]] = affine.apply #[[$MAP0]]()[%[[D0_0]], %[[D0_1]]] | ||
| // CHECK: tensor.pad %{{.*}} low[0, 0, 0, 0] high[0, 0, %[[H0]], 12] | ||
| // CHECK: : tensor<1x16x?x4xf32> to tensor<1x16x?x16xf32> | ||
| // CHECK: tensor.pad %{{.*}} low[0, 0, 0, 0] high[0, 0, 0, 12] | ||
| // CHECK: : tensor<16x3x3x4xf32> to tensor<16x3x3x16xf32> | ||
| // CHECK: %[[D1_0:.*]] = tensor.dim %{{.*}}, %[[C2]] : tensor<1x14x?x16xf32> | ||
| // CHECK: %[[H1:.*]] = affine.apply #[[$MAP1]]()[%[[D0_0]], %[[D1_0]]] | ||
| // CHECK: tensor.pad %{{.*}} low[0, 0, 0, 0] high[0, 0, %[[H1]], 0] | ||
| // CHECK: : tensor<1x14x?x16xf32> to tensor<1x14x?x16xf32> | ||
| // CHECK: %[[D2_0:.*]] = tensor.dim %{{.*}}, %[[C2]] : tensor<1x14x?x16xf32> | ||
| // CHECK-NEXT: linalg.conv_2d_nhwc_fhwc | ||
| // CHECK: tensor.extract_slice %{{.*}}[0, 0, 0, 0] [1, 14, %[[D2_0]], 16] [1, 1, 1, 1] : tensor<1x14x?x16xf32> to tensor<1x14x?x16xf32> | ||
|
|
||
| %0 = linalg.conv_2d_nhwc_fhwc | ||
| {dilations = dense<1> : tensor<2xi64>, strides = dense<1> : tensor<2xi64> } | ||
| ins(%arg0, %arg1: tensor<1x16x?x4xf32>, tensor<16x3x3x4xf32>) | ||
| outs(%arg2: tensor<1x14x?x16xf32>) -> tensor<1x14x?x16xf32> | ||
| return %0 : tensor<1x14x?x16xf32> | ||
| } | ||
|
|
||
| module attributes {transform.with_named_sequence} { | ||
| transform.named_sequence @__transform_main(%arg1: !transform.any_op {transform.readonly}) { | ||
| %0 = transform.structured.match ops{["linalg.conv_2d_nhwc_fhwc"]} in %arg1 : (!transform.any_op) -> !transform.any_op | ||
| %padded, %pad = transform.structured.pad_tiling_interface %0 to padding_sizes [0, 0, 16, 0, 0, 0, 16] pad_to_multiple_of { | ||
| padding_values = [0.0 : f32, 0.0 : f32, 0.0 : f32, 0.0 : f32, 0.0 : f32, 0.0 : f32, 0.0 : f32] | ||
| } : (!transform.any_op) -> (!transform.any_op, !transform.any_op) | ||
| transform.yield | ||
| } | ||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -69,22 +69,22 @@ module { | |
|
|
||
| // CHECK-LABEL: @generic | ||
| // CHECK-SAME: %[[T0:.*]]: tensor<7x5xf32>, | ||
| // CHECK-SAME: %[[T1:.*]]: tensor<7x11x12xf32>) | ||
| func.func @generic(%arg0: tensor<7x5xf32>, %arg1: tensor<7x11x12xf32>) -> tensor<7x11x12xf32> { | ||
| // CHECK-SAME: %[[T1:.*]]: tensor<7x11x11xf32>) | ||
| func.func @generic(%arg0: tensor<7x5xf32>, %arg1: tensor<7x11x11xf32>) -> tensor<7x11x11xf32> { | ||
|
|
||
| // CHECK-DAG: %[[CST:.*]] = arith.constant 0. | ||
|
|
||
| // CHECK: %[[PAD0:.*]] = tensor.pad %[[T0]] low[0, 0] high[1, 0] | ||
| // CHECK: : tensor<7x5xf32> to tensor<8x5xf32> | ||
| // CHECK: %[[PAD1:.*]] = tensor.pad %[[T1]] low[0, 0, 0] high[1, 3, 1] { | ||
| // CHECK: : tensor<7x11x12xf32> to tensor<8x14x13xf32> | ||
| // CHECK: : tensor<7x11x11xf32> to tensor<8x14x12xf32> | ||
| // CHECK-NEXT: linalg.generic | ||
| // CHECK: tensor.extract_slice %{{.*}}[0, 0, 0] [7, 11, 12] [1, 1, 1] : tensor<8x14x13xf32> to tensor<7x11x12xf32> | ||
| %0 = linalg.generic {indexing_maps = [#map, #map1], iterator_types = ["parallel", "parallel", "reduction"]} ins(%arg0 : tensor<7x5xf32>) outs(%arg1 : tensor<7x11x12xf32>) { | ||
| // CHECK: tensor.extract_slice %{{.*}}[0, 0, 0] [7, 11, 11] [1, 1, 1] : tensor<8x14x12xf32> to tensor<7x11x11xf32> | ||
| %0 = linalg.generic {indexing_maps = [#map, #map1], iterator_types = ["parallel", "parallel", "reduction"]} ins(%arg0 : tensor<7x5xf32>) outs(%arg1 : tensor<7x11x11xf32>) { | ||
| ^bb0(%in: f32, %out: f32): | ||
| linalg.yield %in : f32 | ||
| } -> tensor<7x11x12xf32> | ||
| return %0 : tensor<7x11x12xf32> | ||
|
Comment on lines
-72
to
-87
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. why were these test inputs changed?
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please refer to the explanation below. I think this test is similar to the convolution case that the final shape after (d0 + d1) mapping might be wrong. |
||
| } -> tensor<7x11x11xf32> | ||
| return %0 : tensor<7x11x11xf32> | ||
| } | ||
| module attributes {transform.with_named_sequence} { | ||
| transform.named_sequence @__transform_main(%arg0: !transform.any_op {transform.readonly}) { | ||
|
|
@@ -102,7 +102,7 @@ module { | |
|
|
||
|
|
||
| // CHECK-DAG: #[[$MAP0:.*]] = affine_map<()[s0] -> (-s0 + 8)> | ||
| // CHECK-DAG: #[[$MAP1:.*]] = affine_map<()[s0] -> (-s0 + 13)> | ||
| // CHECK-DAG: #[[$MAP1:.*]] = affine_map<()[s0] -> (-s0 + 12)> | ||
| // CHECK-DAG: #[[$MAP2:.*]] = affine_map<()[s0] -> (s0 + 5)> | ||
|
|
||
| #map = affine_map<(d0, d1, d2) -> (d0, d1)> | ||
|
|
@@ -127,13 +127,13 @@ module { | |
| // CHECK: %[[D2_0:.*]] = tensor.dim %{{.*}}, %[[C2]] : tensor<?x11x?xf32> | ||
| // CHECK: %[[H2:.*]] = affine.apply #[[$MAP1]]()[%[[D2_0]]] | ||
| // CHECK: tensor.pad %{{.*}} low[0, 0, 0] high[%[[H1]], 3, %[[H2]]] { | ||
| // CHECK: : tensor<?x11x?xf32> to tensor<8x14x13xf32> | ||
| // CHECK: : tensor<?x11x?xf32> to tensor<8x14x12xf32> | ||
| // | ||
| // CHECK: %[[D0_2:.*]] = tensor.dim %{{.*}}, %[[C0]] : tensor<?x5xf32> | ||
| // CHECK: %[[D2_1:.*]] = affine.apply #[[$MAP2]]()[%[[D0_2]]] | ||
| // CHECK: linalg.generic {{.*}} ins(%{{.*}} : tensor<8x5xf32>) outs(%{{.*}} : tensor<8x14x13xf32>) { | ||
| // CHECK: } -> tensor<8x14x13xf32> | ||
| // CHECK: tensor.extract_slice %{{.*}}[0, 0, 0] [%[[D0_2]], 11, %[[D2_1]]] [1, 1, 1] : tensor<8x14x13xf32> to tensor<?x11x?xf32> | ||
| // CHECK: linalg.generic {{.*}} ins(%{{.*}} : tensor<8x5xf32>) outs(%{{.*}} : tensor<8x14x12xf32>) { | ||
| // CHECK: } -> tensor<8x14x12xf32> | ||
| // CHECK: tensor.extract_slice %{{.*}}[0, 0, 0] [%[[D0_2]], 11, %[[D2_1]]] [1, 1, 1] : tensor<8x14x12xf32> to tensor<?x11x?xf32> | ||
| // | ||
| %0 = linalg.generic {indexing_maps = [#map, #map1], iterator_types = ["parallel", "parallel", "reduction"]} ins(%arg0 : tensor<?x5xf32>) outs(%arg1 : tensor<?x11x?xf32>) { | ||
| ^bb0(%in: f32, %out: f32): | ||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.