| 647 | |
| 648 | template <typename T> |
| 649 | void TensorFromArray(const T* src, |
| 650 | const size_t& array_size, |
| 651 | const phi::DeviceContext& ctx, |
| 652 | DenseTensor* dst) { |
| 653 | auto dst_place = ctx.GetPlace(); |
| 654 | auto src_ptr = static_cast<const void*>(src); |
| 655 | phi::CPUPlace src_place; |
| 656 | dst->Resize({static_cast<int64_t>(array_size)}); |
| 657 | ctx.template Alloc<T>(dst); |
| 658 | auto dst_ptr = static_cast<void*>(dst->data<T>()); |
| 659 | auto size = array_size * sizeof(T); |
| 660 | |
| 661 | if (dst_place.GetType() == AllocationType::CPU) { |
| 662 | memory_utils::Copy(dst_place, dst_ptr, src_place, src_ptr, size); |
| 663 | } |
| 664 | #if defined(PADDLE_WITH_CUDA) || defined(PADDLE_WITH_HIP) |
| 665 | else if (dst_place.GetType() == AllocationType::GPU) { // NOLINT |
| 666 | const void* stable_src_ptr = |
| 667 | backends::gpu::RestoreHostMemIfCapturingCUDAGraph( |
| 668 | const_cast<uint8_t*>(reinterpret_cast<const uint8_t*>(src_ptr)), |
| 669 | size); |
| 670 | memory_utils::Copy(dst_place, |
| 671 | dst_ptr, |
| 672 | src_place, |
| 673 | stable_src_ptr, |
| 674 | size, |
| 675 | reinterpret_cast<const phi::GPUContext&>(ctx).stream()); |
| 676 | } |
| 677 | #endif |
| 678 | #ifdef PADDLE_WITH_CUSTOM_DEVICE |
| 679 | else if (dst_place.GetType() == AllocationType::CUSTOM) { // NOLINT |
| 680 | memory_utils::Copy( |
| 681 | dst_place, |
| 682 | dst_ptr, |
| 683 | src_place, |
| 684 | src_ptr, |
| 685 | size, |
| 686 | reinterpret_cast<const phi::CustomContext&>(ctx).stream()); |
| 687 | } |
| 688 | #endif |
| 689 | #ifdef PADDLE_WITH_XPU |
| 690 | else if (dst_place.GetType() == AllocationType::XPU) { // NOLINT |
| 691 | memory_utils::Copy(dst_place, dst_ptr, src_place, src_ptr, size); |
| 692 | } |
| 693 | #endif |
| 694 | else { // NOLINT |
| 695 | PADDLE_THROW(common::errors::Unimplemented( |
| 696 | "TensorFromArray on %s is not supported.", dst_place)); |
| 697 | } |
| 698 | } |
| 699 | |
| 700 | template void TensorFromArray<bool>(const bool* src, |
| 701 | const size_t& array_size, |
no test coverage detected