| 505 | */ |
| 506 | template <typename SourceObject> |
| 507 | void CopyToExternalImplGPU(SourceObject &src, |
| 508 | py::object dst_ptr, py::object cuda_stream, |
| 509 | bool non_blocking, bool use_copy_kernel) { |
| 510 | CUDAStreamLease lease; |
| 511 | AccessOrder copy_order; |
| 512 | AccessOrder wait_order = non_blocking ? src.order() : AccessOrder::host(); |
| 513 | int device = src.device_id(); |
| 514 | if (!cuda_stream.is_none()) { |
| 515 | cudaStream_t stream = static_cast<cudaStream_t>(ctypes_void_ptr(cuda_stream)); |
| 516 | copy_order = AccessOrder(stream, device); |
| 517 | } else { |
| 518 | lease = CUDAStreamPool::instance().Get(device); |
| 519 | copy_order = AccessOrder(lease, device); |
| 520 | } |
| 521 | |
| 522 | void *ptr = ctypes_void_ptr(dst_ptr); |
| 523 | CopyToExternal<mm::memory_kind::device>(ptr, std::nullopt, src, copy_order, use_copy_kernel); |
| 524 | |
| 525 | wait_order.wait(copy_order); |
| 526 | } |
| 527 | |
| 528 | template <typename Backend> |
| 529 | py::object GetTensorProperty(const Tensor<Backend> &tensor, std::string name) { |
no test coverage detected