From 665329b5fc6e5d8ab47f481a92aa56e75d6275df Mon Sep 17 00:00:00 2001 From: zhangting2020 <709968123@qq.com> Date: Fri, 19 Jun 2020 06:35:37 +0000 Subject: [PATCH 1/3] use IndexList to improve performance, test=develop --- paddle/fluid/operators/instance_norm_op.cc | 36 +++++++++++++++++----- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/paddle/fluid/operators/instance_norm_op.cc b/paddle/fluid/operators/instance_norm_op.cc index f72f7e8b85b873..2bd86e95e4bacf 100644 --- a/paddle/fluid/operators/instance_norm_op.cc +++ b/paddle/fluid/operators/instance_norm_op.cc @@ -180,12 +180,22 @@ class InstanceNormKernel auto &dev_ctx = ctx.template device_context(); auto *place = dev_ctx.eigen_device(); - +// The IndexList requires a c++11 compliant compiler. If the compiler +// is older we need to use arrays of indices instead. +#ifndef EIGEN_HAS_INDEX_LIST Eigen::DSizes bcast(1, sample_size); Eigen::DSizes C_shape(C, 1); Eigen::DSizes NxC_shape(NxC, 1); - Eigen::DSizes shape(NxC, sample_size); - + Eigen::DSizes rdims(1); +#else + Eigen::IndexList, int> bcast; + bcast.set(1, sample_size); + Eigen::IndexList> C_shape; + C_shape.set(0, C); + Eigen::IndexList> NxC_shape; + NxC_shape.set(0, NxC); + Eigen::IndexList> rdims; +#endif math::SetConstant set_constant; saved_mean->mutable_data(ctx.GetPlace()); @@ -198,11 +208,10 @@ class InstanceNormKernel auto saved_variance_a = framework::EigenVector::Flatten(*saved_variance); auto saved_variance_e = saved_variance_a.reshape(NxC_shape); + Eigen::DSizes shape(NxC, sample_size); auto x_e = framework::EigenVector::Flatten(*x); auto x_arr = x_e.reshape(shape); - Eigen::DSizes rdims(1); - saved_mean_e.device(*place) = x_arr.mean(rdims); auto saved_variance_arr = (x_arr - saved_mean_e.broadcast(bcast)).square().mean(rdims) + epsilon; @@ -316,14 +325,25 @@ class InstanceNormGradKernel auto &dev_ctx = ctx.template device_context(); auto *place = dev_ctx.eigen_device(); + Eigen::DSizes rshape(NxC, sample_size); + Eigen::DSizes param_shape(N, C); + Eigen::DSizes shape(NxC, sample_size); +#ifndef EIGEN_HAS_INDEX_LIST Eigen::DSizes rdims(0); Eigen::DSizes mean_rdims(1); - Eigen::DSizes rshape(NxC, sample_size); Eigen::DSizes bcast(1, sample_size); Eigen::DSizes C_shape(C, 1); Eigen::DSizes NxC_shape(NxC, 1); - Eigen::DSizes param_shape(N, C); - Eigen::DSizes shape(NxC, sample_size); +#else + Eigen::IndexList, int> rdims; + Eigen::IndexList, int> mean_rdims; + Eigen::IndexList, int> bcast; + bcast.set(1, sample_size); + Eigen::IndexList> C_shape; + C_shape.set(0, C); + Eigen::IndexList> NxC_shape; + NxC_shape.set(0, NxC); +#endif math::SetConstant set_constant; From 1636a1191f30b7d128fb73bf2676436d20f3ed7a Mon Sep 17 00:00:00 2001 From: zhangting2020 <709968123@qq.com> Date: Sun, 28 Jun 2020 09:10:24 +0000 Subject: [PATCH 2/3] remove EIGEN_HAS_INDEX_LIST, test=develop --- paddle/fluid/operators/instance_norm_op.cc | 23 ++++------------------ 1 file changed, 4 insertions(+), 19 deletions(-) diff --git a/paddle/fluid/operators/instance_norm_op.cc b/paddle/fluid/operators/instance_norm_op.cc index 2bd86e95e4bacf..ec5175c14dbf89 100644 --- a/paddle/fluid/operators/instance_norm_op.cc +++ b/paddle/fluid/operators/instance_norm_op.cc @@ -180,14 +180,7 @@ class InstanceNormKernel auto &dev_ctx = ctx.template device_context(); auto *place = dev_ctx.eigen_device(); -// The IndexList requires a c++11 compliant compiler. If the compiler -// is older we need to use arrays of indices instead. -#ifndef EIGEN_HAS_INDEX_LIST - Eigen::DSizes bcast(1, sample_size); - Eigen::DSizes C_shape(C, 1); - Eigen::DSizes NxC_shape(NxC, 1); - Eigen::DSizes rdims(1); -#else + Eigen::IndexList, int> bcast; bcast.set(1, sample_size); Eigen::IndexList> C_shape; @@ -195,7 +188,7 @@ class InstanceNormKernel Eigen::IndexList> NxC_shape; NxC_shape.set(0, NxC); Eigen::IndexList> rdims; -#endif + math::SetConstant set_constant; saved_mean->mutable_data(ctx.GetPlace()); @@ -328,22 +321,14 @@ class InstanceNormGradKernel Eigen::DSizes rshape(NxC, sample_size); Eigen::DSizes param_shape(N, C); Eigen::DSizes shape(NxC, sample_size); -#ifndef EIGEN_HAS_INDEX_LIST - Eigen::DSizes rdims(0); - Eigen::DSizes mean_rdims(1); - Eigen::DSizes bcast(1, sample_size); - Eigen::DSizes C_shape(C, 1); - Eigen::DSizes NxC_shape(NxC, 1); -#else - Eigen::IndexList, int> rdims; - Eigen::IndexList, int> mean_rdims; + Eigen::IndexList> rdims; + Eigen::IndexList> mean_rdims; Eigen::IndexList, int> bcast; bcast.set(1, sample_size); Eigen::IndexList> C_shape; C_shape.set(0, C); Eigen::IndexList> NxC_shape; NxC_shape.set(0, NxC); -#endif math::SetConstant set_constant; From 572f972583f3e9a79b0289eb19a13be6dbb01796 Mon Sep 17 00:00:00 2001 From: zhangting2020 <709968123@qq.com> Date: Sun, 13 Sep 2020 14:06:24 +0000 Subject: [PATCH 3/3] use IndexList only when EIGEN_HAS_INDEX_LIST is true --- paddle/fluid/operators/instance_norm_op.cc | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/paddle/fluid/operators/instance_norm_op.cc b/paddle/fluid/operators/instance_norm_op.cc index ec5175c14dbf89..a15f94b78c3c4b 100644 --- a/paddle/fluid/operators/instance_norm_op.cc +++ b/paddle/fluid/operators/instance_norm_op.cc @@ -181,6 +181,14 @@ class InstanceNormKernel auto &dev_ctx = ctx.template device_context(); auto *place = dev_ctx.eigen_device(); + Eigen::DSizes shape(NxC, sample_size); +// Once eigen on Windows is updated, the if branch can be removed. +#ifndef EIGEN_HAS_INDEX_LIST + Eigen::DSizes bcast(1, sample_size); + Eigen::DSizes C_shape(C, 1); + Eigen::DSizes NxC_shape(NxC, 1); + Eigen::DSizes rdims(1); +#else Eigen::IndexList, int> bcast; bcast.set(1, sample_size); Eigen::IndexList> C_shape; @@ -188,6 +196,7 @@ class InstanceNormKernel Eigen::IndexList> NxC_shape; NxC_shape.set(0, NxC); Eigen::IndexList> rdims; +#endif math::SetConstant set_constant; @@ -201,7 +210,6 @@ class InstanceNormKernel auto saved_variance_a = framework::EigenVector::Flatten(*saved_variance); auto saved_variance_e = saved_variance_a.reshape(NxC_shape); - Eigen::DSizes shape(NxC, sample_size); auto x_e = framework::EigenVector::Flatten(*x); auto x_arr = x_e.reshape(shape); @@ -321,6 +329,13 @@ class InstanceNormGradKernel Eigen::DSizes rshape(NxC, sample_size); Eigen::DSizes param_shape(N, C); Eigen::DSizes shape(NxC, sample_size); +#ifndef EIGEN_HAS_INDEX_LIST + Eigen::DSizes rdims(0); + Eigen::DSizes mean_rdims(1); + Eigen::DSizes bcast(1, sample_size); + Eigen::DSizes C_shape(C, 1); + Eigen::DSizes NxC_shape(NxC, 1); +#else Eigen::IndexList> rdims; Eigen::IndexList> mean_rdims; Eigen::IndexList, int> bcast; @@ -329,6 +344,7 @@ class InstanceNormGradKernel C_shape.set(0, C); Eigen::IndexList> NxC_shape; NxC_shape.set(0, NxC); +#endif math::SetConstant set_constant;