         // real_pair_size) this valid for pair_fwd, pair_bwd, pair_mask_fwd,
         // pair_mask_bwd, mask_argsort_fwd, mask_argsort_bwd.
         int pair_fwd_size_padded =
-            is_subm ? real_num_act_in : out_inds_num_limit;
+            is_subm ? static_num_act_in : out_inds_num_limit;
         tv::Tensor pair_fwd_padded =
             tv::empty({KV, pair_fwd_size_padded}, tv::int32, 0);
         // you can find equivalent python code of following code in python

              weights, pair, indices_kernel_num, arch, out_features_real.dim(0),
              inverse, is_subm,
              static_cast<int>(tv::gemm::SparseConvAlgo::kNative),
              reinterpret_cast<std::uintptr_t>(stream), bias, 1.0,
              /*bias alpha, only used for leaky relu*/, 0.0,
              tv::gemm::Activation::kReLU);
        } else {
          // regular conv use numbers in indices_kernel_num to perform gemm
          // so we don't need to slice.

        // only regular conv need direct table.
        bool use_direct_table = direct_table && !is_subm;
        auto max_act_out_theory = SpconvOps::get_handcrafted_max_act_out(
            static_num_act_in, ksize, stride, padding, dilation);
        // query workspace size.
        int workspace_size = SpconvOps::get_indice_gen_workspace_size(
            KV, static_num_act_in, out_inds_num_limit, max_act_out_theory,
            is_subm, use_int64_hash_k, use_direct_table);
        // you should return workspace size in tensorrt plugin method.
        tv::Tensor workspace = tv::empty({workspace_size}, tv::uint8, 0);
