diff --git a/paddle/fluid/operators/split_op.cc b/paddle/fluid/operators/split_op.cc index 661e4ca727beecee3d04f8bf2bc036395bfcf2a9..f81ac8882d1076a0999acc0810a0a387028d6c7c 100644 --- a/paddle/fluid/operators/split_op.cc +++ b/paddle/fluid/operators/split_op.cc @@ -78,9 +78,18 @@ class SplitOp : public framework::OperatorWithKernel { #ifdef PADDLE_WITH_MKLDNN if (this->CanMKLDNNBeUsed(ctx, input_data_type)) { - return framework::OpKernelType(input_data_type, ctx.GetPlace(), - framework::DataLayout::kMKLDNN, - framework::LibraryType::kMKLDNN); + // OneDNN uses blocking format, which cannot be always + // supported with reorders, because if blocked dimension is not divisible + // by + // 8 or 16(depending on which blocking format is used) submemory cannot be + // created, so in that scenario a fallback is needed + auto tmp_md = dnnl::memory::desc( + framework::vectorize(ctx.Input("X")->dims()), + dnnl::memory::data_type::f32, ctx.Input("X")->format()); + if (tmp_md.data.format_desc.blocking.inner_nblks == 0) + return framework::OpKernelType(input_data_type, ctx.GetPlace(), + framework::DataLayout::kMKLDNN, + framework::LibraryType::kMKLDNN); } #endif return framework::OpKernelType(input_data_type, ctx.GetPlace());