| 14 | } |
| 15 | |
| 16 | void ParamPackConcatImpl::exec( |
| 17 | _megdnn_tensor_in srcs, _megdnn_tensor_in offsets, _megdnn_tensor_out dst, |
| 18 | _megdnn_workspace workspace) { |
| 19 | check_exec(dst.layout, offsets.layout, srcs.layout); |
| 20 | auto queue = cnrt_queue(this->handle()); |
| 21 | |
| 22 | size_t inp_size = srcs.layout.shape[0], out_size = dst.layout.total_nr_elems(); |
| 23 | size_t dtype_size = dst.layout.dtype.size(); |
| 24 | |
| 25 | const void** src_cpu = static_cast<const void**>(srcs.raw_ptr()); |
| 26 | megdnn_assert_internal(src_cpu); |
| 27 | const void** src_gpu = reinterpret_cast<const void**>(workspace.raw_ptr); |
| 28 | |
| 29 | int32_t* offsets_gpu = offsets.ptr<int32_t>(); |
| 30 | cnrt_check(cnrtMemcpyAsync( |
| 31 | src_gpu, src_cpu, sizeof(void*) * inp_size, queue, cnrtMemcpyHostToDev)); |
| 32 | cnrt_check(cnrtMemsetAsync(dst.raw_ptr(), 0, out_size * dtype_size, queue)); |
| 33 | |
| 34 | auto bang_handle = concrete_banghandle(this->handle()); |
| 35 | param_pack::concat_proxy( |
| 36 | bang_handle, src_gpu, dst.raw_ptr(), offsets_gpu, dtype_size, inp_size); |
| 37 | } |
| 38 | |
| 39 | } // namespace cambricon |
| 40 | } // namespace megdnn |
nothing calls this directly
no test coverage detected