Skip to content

Commit b6f75bc

Browse files
committed
Add mkldnn support for adaptive_avg_pool2d
1 parent 95ce796 commit b6f75bc

File tree

4 files changed

+72
-4
lines changed

4 files changed

+72
-4
lines changed

aten/src/ATen/native/AdaptiveAveragePooling.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -262,9 +262,11 @@ namespace {
262262
return output;
263263
}
264264

265-
Tensor adaptive_avg_pool2d(
266-
at::Tensor const& input,
267-
IntArrayRef output_size){
265+
Tensor adaptive_avg_pool2d(at::Tensor const& input, IntArrayRef output_size) {
266+
if (input.is_mkldnn()) {
267+
return at::mkldnn_adaptive_avg_pool2d(input, output_size);
268+
}
269+
268270
if (output_size[0] == 1 && output_size[1] == 1) {
269271
//in this case, adaptive pooling is just computing mean over hw dimensions, which can be done more efficiently
270272
int64_t mean_size = input.size(-1) * input.size(-2);

aten/src/ATen/native/mkldnn/Pooling.cpp

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,19 @@ Tensor& mkldnn_avg_pool2d_out(
4141
bool count_include_pad) {
4242
AT_ERROR("mkldnn_avg_pool2d_out: ATen not compiled with MKLDNN support");
4343
}
44+
45+
Tensor mkldnn_adaptive_avg_pool2d(Tensor const& input, IntArrayRef output_size) {
46+
AT_ERROR("mkldnn_adaptive_avg_pool2d: ATen not compiled with MKLDNN support");
47+
}
48+
49+
Tensor& mkldnn_adaptive_avg_pool2d_out(
50+
Tensor& output,
51+
const Tensor& input,
52+
IntArrayRef output_size) {
53+
AT_ERROR(
54+
"mkldnn_adaptive_avg_pool2d_out: ATen not compiled with MKLDNN support");
55+
}
56+
4457
} // namespace native
4558
} // namespace at
4659

@@ -118,7 +131,7 @@ Tensor mkldnn_avg_pool2d(
118131
kernel_size,
119132
stride,
120133
padding,
121-
std::vector<int64_t>{1, 1},
134+
/*dilation*/ std::vector<int64_t>{1, 1},
122135
ceil_mode,
123136
count_include_pad ? ideep::algorithm::pooling_avg_include_padding
124137
: ideep::algorithm::pooling_avg_exclude_padding);
@@ -136,6 +149,42 @@ Tensor& mkldnn_avg_pool2d_out(
136149
"mkldnn_avg_pool2d_out: in-place mkldnn operations are not supported yet");
137150
}
138151

152+
Tensor mkldnn_adaptive_avg_pool2d(
153+
Tensor const& input,
154+
IntArrayRef output_size) {
155+
AT_ASSERTM(input.dim() == 4, "mkldnn_adaptive_avg_pool2d: Expect 2D input");
156+
157+
auto output_size_vec =
158+
expand_param_if_needed(output_size, "output_size", input.dim() - 2);
159+
std::vector<int64_t> kernel_size(input.dim() - 2);
160+
for (size_t i = 2; i < input.dim(); ++i) {
161+
auto s1 = input.size(i);
162+
auto s2 = output_size_vec[i - 2];
163+
AT_ASSERTM(s2 != 0, "output size can not be zero");
164+
AT_ASSERTM(
165+
s1 % s2 == 0,
166+
"input size is not divisible by the output size is not supported yet");
167+
kernel_size[i - 2] = s1 / s2;
168+
}
169+
return _mkldnn_pool2d(
170+
input,
171+
kernel_size,
172+
/*stride*/ kernel_size,
173+
/*padding*/ {0, 0},
174+
/*dilation*/ {1, 1},
175+
/*ceil_mode*/ false,
176+
/*algo*/ ideep::algorithm::pooling_avg);
177+
}
178+
179+
Tensor& mkldnn_adaptive_avg_pool2d_out(
180+
Tensor& output,
181+
const Tensor& input,
182+
IntArrayRef output_size) {
183+
AT_ERROR(
184+
"mkldnn_adaptive_avg_pool2d_out: in-place mkldnn operations are not supported yet");
185+
}
186+
187+
139188
} // namespace native
140189
} // namespace at
141190

aten/src/ATen/native/native_functions.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3634,10 +3634,16 @@
36343634
dispatch:
36353635
CPU: adaptive_avg_pool2d_out_cpu
36363636
CUDA: adaptive_avg_pool2d_out_cuda
3637+
MkldnnCPU: mkldnn_adaptive_avg_pool2d_out
36373638

36383639
- func: adaptive_avg_pool2d(Tensor self, int[2] output_size) -> Tensor
36393640
python_module: nn
36403641

3642+
- func: mkldnn_adaptive_avg_pool2d(Tensor self, int[2] output_size) -> Tensor
3643+
dispatch:
3644+
MkldnnCPU: mkldnn_adaptive_avg_pool2d
3645+
requires_tensor: True
3646+
36413647
- func: _adaptive_avg_pool2d(Tensor self, int[2] output_size) -> Tensor
36423648
dispatch:
36433649
CPU: adaptive_avg_pool2d_cpu

test/test_mkldnn.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,17 @@ def test_avg_pool2d(self):
148148
avg_pool2d(x),
149149
avg_pool2d(x.to_mkldnn()).to_dense())
150150

151+
def test_adaptive_avg_pool2d(self):
152+
N = torch.randint(3, 10, (1,)).item()
153+
C = torch.randint(3, 10, (1,)).item()
154+
x = torch.randn(N, C, 224, 224, dtype=torch.float32) * 100
155+
156+
adaptive_avg_pool2d = torch.nn.AdaptiveAvgPool2d(7)
157+
158+
self.assertEqual(
159+
adaptive_avg_pool2d(x),
160+
adaptive_avg_pool2d(x.to_mkldnn()).to_dense())
161+
151162
def test_batch_norm2d(self):
152163
N = torch.randint(3, 10, (1,)).item()
153164
C = torch.randint(3, 100, (1,)).item()

0 commit comments

Comments
 (0)