From 056edf3929543def25a13155919ce49f220d7a03 Mon Sep 17 00:00:00 2001 From: Adam <38704900+grygielski@users.noreply.github.com> Date: Wed, 11 Mar 2020 04:32:31 +0100 Subject: [PATCH] Change ShareDataWith() to TensorCopy() in conv_mkldnn (#22695) --- paddle/fluid/framework/tensor_util.cc | 13 +++++++++++++ paddle/fluid/operators/mkldnn/conv_mkldnn_op.cc | 10 ++++++---- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/paddle/fluid/framework/tensor_util.cc b/paddle/fluid/framework/tensor_util.cc index 8b2e3fc323c..e766c53713a 100644 --- a/paddle/fluid/framework/tensor_util.cc +++ b/paddle/fluid/framework/tensor_util.cc @@ -48,6 +48,19 @@ void TensorCopy(const Tensor& src, const platform::Place& dst_place, } auto size = src.numel() * SizeOfType(src.type()); +#ifdef PADDLE_WITH_MKLDNN + if (src.layout() == DataLayout::kMKLDNN) { + PADDLE_ENFORCE_EQ( + src.memory_size(), dst->memory_size(), + platform::errors::InvalidArgument( + "When copying tensor with MKL-DNN data layout, " + "memory size of source tensor should be the same as memory size of " + "destination tensor. " + "But received src.memory_size = %d, dst.memory_size = %d.", + src.memory_size(), dst->memory_size())); + size = src.memory_size(); + } +#endif if (platform::is_cpu_place(src_place) && platform::is_cpu_place(dst_place)) { memory::Copy(boost::get(dst_place), dst_ptr, diff --git a/paddle/fluid/operators/mkldnn/conv_mkldnn_op.cc b/paddle/fluid/operators/mkldnn/conv_mkldnn_op.cc index 7faf66a6e83..42b282ad272 100644 --- a/paddle/fluid/operators/mkldnn/conv_mkldnn_op.cc +++ b/paddle/fluid/operators/mkldnn/conv_mkldnn_op.cc @@ -316,8 +316,9 @@ class ConvMKLDNNOpKernel : public paddle::framework::OpKernel { dst_memory_p = handler.AcquireDstMemoryFromResidualDataMemory( user_residual_memory_p, to_void_cast(output_data), pipeline); } else { - output->ShareDataWith(*residual_param); - auto output_data = output->mutable_data(ctx.GetPlace()); + auto output_data = output->mutable_data( + ctx.GetPlace(), residual_param->memory_size()); + framework::TensorCopy(*residual_param, residual_param->place(), output); dst_memory_p = handler.AcquireDstMemoryFromPrimitive(to_void_cast(output_data)); } @@ -610,7 +611,8 @@ class ConvMKLDNNOpKernel : public paddle::framework::OpKernel { ctx, output, residual_param, user_residual_md, handler, &pipeline); } else { - output->ShareDataWith(*residual_param); + framework::TensorCopy(*residual_param, residual_param->place(), + output); dst_memory_p = platform::SetDstMemory(ctx, output, handler); } need_s8_to_u8 = @@ -681,7 +683,7 @@ class ConvMKLDNNOpKernel : public paddle::framework::OpKernel { if (fuse_residual_conn) { auto residual_param = ctx.Input("ResidualData"); - output->ShareDataWith(*residual_param); + framework::TensorCopy(*residual_param, residual_param->place(), output); need_s8_to_u8 = (platform::MKLDNNGetDataType() == memory::data_type::s8) && unsigned_output; -- GitLab