 }
 
 template <class T>
-void FuseLodTensorSumCompute(const framework::ExecutionContext &context) {
+void SumToLoDTensor(const framework::ExecutionContext &context) {
   auto in_vars = context.MultiInputVar("X");
   const size_t in_num = in_vars.size();
 

  };

  auto *out = context.Output<LoDTensor>("Out");

  auto out_var = context.OutputVar("Out");
  bool in_place = in_vars[0] == out_var;

  if (!in_place) {
    out->mutable_data<T>(context.GetPlace());
  }
  int start = in_place ? 1 : 0;
  if (!in_place) {
    // seperate path for a+b,maybe not fast than eigen
    if (in_num == 2 && in_vars[0]->IsType<framework::LoDTensor>() &&
        in_vars[1]->IsType<framework::LoDTensor>()) {
      auto &in_0 = in_vars[0]->Get<framework::LoDTensor>();
      auto &in_1 = in_vars[1]->Get<framework::LoDTensor>();

      auto length = in_0.numel();
      if (length) {
        ComputeKernelParameter(length);
        Sum2CUDAKernel<T><<<grids, blocks, 0, stream>>>(
            in_0.data<T>(), in_1.data<T>(), out->data<T>(), length);
      }
      return;
    }
  }
  if (!in_place) {
    math::SetConstant<platform::CUDADeviceContext, T> constant_functor;
    constant_functor(

    : public framework::OpKernel<T> {
 public:
  void Compute(const framework::ExecutionContext &context) const override {
    auto out_var = context.OutputVar("Out");

    if (out_var->IsType<framework::LoDTensor>()) {
      SumToLoDTensor<T>(context);
    } else if (out_var->IsType<framework::SelectedRows>()) {
      SelectedRowsCompute<platform::CUDADeviceContext, T>(context);
    } else if (out_var->IsType<framework::LoDTensorArray>()) {
