// Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "helper.h" template __global__ void SaveOutputDygraphKernel( T* out_pool, const T* cur_out, const int64_t* step_idx, const int* result_idx, const int bsz, const int result_num, const int max_dec_len) { for (int bid = blockIdx.x; bid < bsz; bid += gridDim.x) { auto src_addr = cur_out + bid; auto cur_step_idx = step_idx[bid] - 1; for (int i = threadIdx.x; i < result_num; i += blockDim.x) { auto tgt_id = result_idx[bid * result_num + i]; if (tgt_id >= 0) { auto tgt_addr = out_pool + tgt_id * max_dec_len + cur_step_idx; *tgt_addr = *src_addr; } } } } void SaveOutputDygraph( const paddle::Tensor& all_token_ids, const paddle::Tensor& tokens, const paddle::Tensor& result_ids, const paddle::Tensor& step_idx ) { auto cu_stream = all_token_ids.stream(); const int bsz = tokens.shape()[0]; const int result_num = result_ids.shape()[1]; const int max_dec_len = all_token_ids.shape()[1]; SaveOutputDygraphKernel<<>>( const_cast(all_token_ids.data()), tokens.data(), step_idx.data(), result_ids.data(), bsz, result_num, max_dec_len ); // SaveOutputDygraphKernel<<>>( // const_cast(all_scores.data()), // scores.data(), // step_idx.data(), // result_ids.data(), // bsz, // result_num, // max_dec_len // ); } PD_BUILD_OP(save_output_dygraph) .Inputs({"all_token_ids", "tokens", "result_ids", "step_idx"}) .Outputs({"all_token_ids_out"}) .SetInplaceMap({{"all_token_ids", "all_token_ids_out"}}) .SetKernelFn(PD_KERNEL(SaveOutputDygraph));