From 863889276876e35f76c433256285c9363e3dcb31 Mon Sep 17 00:00:00 2001 From: Zhennan Qin Date: Wed, 20 Nov 2019 08:53:34 +0800 Subject: [PATCH 1/5] [MKLDNN] enable MaxPooling for full pooling convention --- src/operator/nn/mkldnn/mkldnn_pooling-inl.h | 14 -------------- src/operator/nn/pooling.cc | 7 ++----- 2 files changed, 2 insertions(+), 19 deletions(-) diff --git a/src/operator/nn/mkldnn/mkldnn_pooling-inl.h b/src/operator/nn/mkldnn/mkldnn_pooling-inl.h index 22e9abd156a3..107fe70533ab 100644 --- a/src/operator/nn/mkldnn/mkldnn_pooling-inl.h +++ b/src/operator/nn/mkldnn/mkldnn_pooling-inl.h @@ -96,20 +96,6 @@ inline bool SupportMKLDNNPooling(const PoolingParam ¶m) { (!param.layout.has_value() || param.layout.value() == mshadow::kNCHW); } -inline bool SupportMKLDNNPooling(const PoolingParam ¶m, - const mxnet::TShape &dshape) { - bool ret = SupportMKLDNNPooling(param); - if (!ret) - return false; - - if (param.pooling_convention == pool_enum::kValid) { - return true; - } else { - // currently, only max-pooling is supported for full convention - return param.pool_type == pool_enum::kMaxPooling; - } -} - inline bool MKLDNNRequireWorkspace(const PoolingParam ¶m) { return param.pool_type != pool_enum::kAvgPooling; } diff --git a/src/operator/nn/pooling.cc b/src/operator/nn/pooling.cc index 485fc1345dfd..2fcc99807015 100644 --- a/src/operator/nn/pooling.cc +++ b/src/operator/nn/pooling.cc @@ -278,9 +278,7 @@ void PoolingComputeExCPU(const nnvm::NodeAttrs &attrs, const OpContext &ctx, return; } - - if (SupportMKLDNN(inputs[0]) && - SupportMKLDNNPooling(param, inputs[0].shape())) { + if (SupportMKLDNN(inputs[0])) { if (MKLDNNRequireWorkspace(param)) { CHECK_GT(outputs.size(), 1U); workspace = &outputs[1]; @@ -306,8 +304,7 @@ void PoolingGradComputeExCPU(const nnvm::NodeAttrs &attrs, const OpContext &ctx, } - if (SupportMKLDNN(inputs[0]) - && SupportMKLDNNPooling(param, inputs[0].shape())) { + if (SupportMKLDNN(inputs[0])) { const NDArray &out_grad = inputs[0]; const NDArray *workspace = nullptr; const NDArray *in_data = nullptr; From a34d946af3b196f8b5f0a7ea5811c0a161b09ea2 Mon Sep 17 00:00:00 2001 From: Zhennan Qin Date: Tue, 26 Nov 2019 13:55:57 +0800 Subject: [PATCH 2/5] Run CI From dfdddc90b9a8c0093410b62d9f584ff184178c8c Mon Sep 17 00:00:00 2001 From: Zhennan Qin Date: Thu, 28 Nov 2019 10:52:03 +0800 Subject: [PATCH 3/5] Fix UT --- src/operator/nn/mkldnn/mkldnn_pooling-inl.h | 31 +++++++++++++++++++++ src/operator/nn/mkldnn/mkldnn_pooling.cc | 7 ----- src/operator/nn/pooling.cc | 6 ++-- 3 files changed, 35 insertions(+), 9 deletions(-) diff --git a/src/operator/nn/mkldnn/mkldnn_pooling-inl.h b/src/operator/nn/mkldnn/mkldnn_pooling-inl.h index 107fe70533ab..59a5a75481a1 100644 --- a/src/operator/nn/mkldnn/mkldnn_pooling-inl.h +++ b/src/operator/nn/mkldnn/mkldnn_pooling-inl.h @@ -89,6 +89,14 @@ class MKLDNNPoolingBwd { const mkldnn::pooling_backward::primitive_desc &GetPd(); }; +inline int GetPaddingSizeFull(dim_t x, int padl, int padr, int k, int s) { + if ((x + padl + padr - k) % s != 0) { + return (padr + s - ((x + padl + padr - k) % s)); + } else { + return padr; + } +} + inline bool SupportMKLDNNPooling(const PoolingParam ¶m) { return param.kernel.ndim() == 2 && (param.pool_type == pool_enum::kMaxPooling || @@ -96,6 +104,29 @@ inline bool SupportMKLDNNPooling(const PoolingParam ¶m) { (!param.layout.has_value() || param.layout.value() == mshadow::kNCHW); } +inline bool SupportMKLDNNPooling(const PoolingParam ¶m, + const mxnet::TShape &dshape) { + bool ret = SupportMKLDNNPooling(param); + if (!ret) + return false; + + if (param.pooling_convention == pool_enum::kValid) { + return true; + } else { + if (param.pool_type == pool_enum::kAvgPooling) { + CHECK_EQ(dshape.ndim(), 4); + if (param.pad[0] == GetPaddingSizeFull(dshape[2], param.pad[0], param.pad[0], param.kernel[0], + param.stride[0]) && + param.pad[1] == GetPaddingSizeFull(dshape[3], param.pad[1], param.pad[1], param.kernel[1], + param.stride[1])) { + return true; + } + return false; + } + return param.pool_type == pool_enum::kMaxPooling; + } +} + inline bool MKLDNNRequireWorkspace(const PoolingParam ¶m) { return param.pool_type != pool_enum::kAvgPooling; } diff --git a/src/operator/nn/mkldnn/mkldnn_pooling.cc b/src/operator/nn/mkldnn/mkldnn_pooling.cc index 6eda2aa33b34..d2f79700051a 100644 --- a/src/operator/nn/mkldnn/mkldnn_pooling.cc +++ b/src/operator/nn/mkldnn/mkldnn_pooling.cc @@ -127,13 +127,6 @@ mkldnn::algorithm GetMKLDNNPoolAlgo(const PoolingParam ¶m) { } } -static inline int GetPaddingSizeFull(dim_t x, int padl, int padr, int k, int s) { - if ((x + padl + padr - k) % s != 0) { - return (padr + s - ((x + padl + padr - k) % s)); - } else { - return padr; - } -} mkldnn::pooling_forward::primitive_desc GetPoolingFwdPdesc( const PoolingParam ¶m, const bool is_train, const mkldnn::memory::desc &data_md, diff --git a/src/operator/nn/pooling.cc b/src/operator/nn/pooling.cc index 2fcc99807015..f998c33d16a8 100644 --- a/src/operator/nn/pooling.cc +++ b/src/operator/nn/pooling.cc @@ -278,7 +278,8 @@ void PoolingComputeExCPU(const nnvm::NodeAttrs &attrs, const OpContext &ctx, return; } - if (SupportMKLDNN(inputs[0])) { + if (SupportMKLDNN(inputs[0]) + && SupportMKLDNNPooling(param, inputs[0].shape())) { if (MKLDNNRequireWorkspace(param)) { CHECK_GT(outputs.size(), 1U); workspace = &outputs[1]; @@ -304,7 +305,8 @@ void PoolingGradComputeExCPU(const nnvm::NodeAttrs &attrs, const OpContext &ctx, } - if (SupportMKLDNN(inputs[0])) { + if (SupportMKLDNN(inputs[0]) + && SupportMKLDNNPooling(param, inputs[0].shape())) { const NDArray &out_grad = inputs[0]; const NDArray *workspace = nullptr; const NDArray *in_data = nullptr; From 315e44e5520d4a707b87d1922e2dc9cbf208d05f Mon Sep 17 00:00:00 2001 From: Zhennan Qin Date: Thu, 28 Nov 2019 10:54:24 +0800 Subject: [PATCH 4/5] Add comment --- src/operator/nn/mkldnn/mkldnn_pooling-inl.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/operator/nn/mkldnn/mkldnn_pooling-inl.h b/src/operator/nn/mkldnn/mkldnn_pooling-inl.h index 59a5a75481a1..08d91af6fbb3 100644 --- a/src/operator/nn/mkldnn/mkldnn_pooling-inl.h +++ b/src/operator/nn/mkldnn/mkldnn_pooling-inl.h @@ -115,6 +115,7 @@ inline bool SupportMKLDNNPooling(const PoolingParam ¶m, } else { if (param.pool_type == pool_enum::kAvgPooling) { CHECK_EQ(dshape.ndim(), 4); + // mkldnn works differently when padding is asymmetric, so let's skip this case. if (param.pad[0] == GetPaddingSizeFull(dshape[2], param.pad[0], param.pad[0], param.kernel[0], param.stride[0]) && param.pad[1] == GetPaddingSizeFull(dshape[3], param.pad[1], param.pad[1], param.kernel[1], From 38d4e56b82af62b67ba1b3c9f2ea34a733e88634 Mon Sep 17 00:00:00 2001 From: Zhennan Qin Date: Fri, 29 Nov 2019 10:21:20 +0800 Subject: [PATCH 5/5] Run CI