void Compute()

in src/lstm_op.cc [264:305]


  void Compute(OpKernelContext* ctx) override {

    const Tensor& c  = ctx->input(0);
    const Tensor& i  = ctx->input(1);
    const Tensor& u  = ctx->input(2);
    const Tensor& f  = ctx->input(3);
    const Tensor& o  = ctx->input(4);
    const Tensor& eh = ctx->input(5);

    int N = c.dim_size(0);
    int K = c.dim_size(1);

    Tensor* dc  = nullptr;
    Tensor* di  = nullptr;
    Tensor* df  = nullptr;
    Tensor* doo = nullptr;
    Tensor* du  = nullptr;
    OP_REQUIRES_OK(ctx, ctx->allocate_output(0, c.shape(), &dc));
    OP_REQUIRES_OK(ctx, ctx->allocate_output(1, c.shape(), &di));
    OP_REQUIRES_OK(ctx, ctx->allocate_output(2, c.shape(), &du));
    OP_REQUIRES_OK(ctx, ctx->allocate_output(3, c.shape(), &df));
    OP_REQUIRES_OK(ctx, ctx->allocate_output(4, c.shape(), &doo));

    VB1* dc_ptr = (VB1*)dc->flat<B>().data();
    VB1* di_ptr = (VB1*)di->flat<B>().data();
    VB1* df_ptr = (VB1*)df->flat<B>().data();
    VB1* do_ptr = (VB1*)doo->flat<B>().data();
    VB1* du_ptr = (VB1*)du->flat<B>().data();
    const VF1*  c_ptr = (const VF1*)c.flat<F>().data();
    const VF1*  i_ptr = (const VF1*)i.flat<F>().data();
    const VF1*  f_ptr = (const VF1*)f.flat<F>().data();
    const VF1*  o_ptr = (const VF1*)o.flat<F>().data();
    const VF1*  u_ptr = (const VF1*)u.flat<F>().data();
    const VB1* eh_ptr = (const VB1*)eh.flat<B>().data();
    const VB1* ec_ptr = nullptr;
    if (ctx->num_inputs() == 7)
      ec_ptr = (const VB1*)ctx->input(6).flat<B>().data();

    CUstream stream = ((CUDAStream*)ctx->op_device_context()->stream()->implementation())->cuda_stream();

    LSTM4_Gates_Backward<VB1,VF1,VB4,VF4>(stream, dc_ptr, di_ptr, df_ptr, do_ptr, du_ptr, ec_ptr, eh_ptr, c_ptr, i_ptr, f_ptr, o_ptr, u_ptr, N, K, forget_bias_);
  }