| 227 | // TODO: implement with kernel. |
| 228 | template <typename ctype> |
| 229 | void copy_general_interior( |
| 230 | _megdnn_tensor_in src, _megdnn_tensor_out dst, RelayoutForwardImpl* opr, |
| 231 | bool cross_dev, int src_dev_id, int dst_dev_id) { |
| 232 | auto handle = concrete_handle(opr->handle()); |
| 233 | auto computing_context = get_cambricon_computing_context(handle); |
| 234 | |
| 235 | auto idst = tensor_iter_valonly<ctype>(dst).begin(); |
| 236 | auto isrc = tensor_iter_valonly<ctype>(src).begin(); |
| 237 | |
| 238 | if (!cross_dev) { |
| 239 | for (size_t i = 0, it = dst.layout.total_nr_elems(); i < it; ++i) { |
| 240 | dt_byte* dst_addr = reinterpret_cast<dt_byte*>(dst.raw_ptr()) + |
| 241 | idst.offset() * dst.layout.dtype.size(); |
| 242 | dt_byte* src_addr = reinterpret_cast<dt_byte*>(src.raw_ptr()) + |
| 243 | isrc.offset() * src.layout.dtype.size(); |
| 244 | cnrt_check(cnrtMemcpyAsync( |
| 245 | static_cast<void*>(dst_addr), static_cast<void*>(src_addr), |
| 246 | dst.layout.dtype.size(), cnrt_queue(handle), |
| 247 | CNRT_MEM_TRANS_DIR_DEV2DEV)); |
| 248 | ++idst; |
| 249 | ++isrc; |
| 250 | } |
| 251 | } else { |
| 252 | for (size_t i = 0, it = dst.layout.total_nr_elems(); i < it; ++i) { |
| 253 | dt_byte* dst_addr = reinterpret_cast<dt_byte*>(dst.raw_ptr()) + |
| 254 | idst.offset() * dst.layout.dtype.size(); |
| 255 | dt_byte* src_addr = reinterpret_cast<dt_byte*>(src.raw_ptr()) + |
| 256 | isrc.offset() * src.layout.dtype.size(); |
| 257 | computing_context->memcpy_peer_async_d2d( |
| 258 | static_cast<void*>(dst_addr), dst_dev_id, |
| 259 | static_cast<void*>(src_addr), src_dev_id, dst.layout.dtype.size()); |
| 260 | ++idst; |
| 261 | ++isrc; |
| 262 | } |
| 263 | } |
| 264 | } |
| 265 | |
| 266 | void copy_general( |
| 267 | _megdnn_tensor_in src, _megdnn_tensor_out dst, RelayoutForwardImpl* opr, |
nothing calls this directly
no test coverage detected