// // Copyright © 2017 Arm Ltd. All rights reserved. // SPDX-License-Identifier: MIT // #include "TensorCopyUtils.hpp" #include #ifdef ARMCOMPUTECL_ENABLED #include #endif #if ARMCOMPUTENEON_ENABLED #include #endif #if ARMCOMPUTECLENABLED || ARMCOMPUTENEON_ENABLED #include #endif #include #include #include #include void CopyDataToITensorHandle(armnn::ITensorHandle* tensorHandle, const void* mem) { switch (tensorHandle->GetType()) { case armnn::ITensorHandle::Cpu: { auto handle = boost::polymorphic_downcast(tensorHandle); memcpy(handle->GetTensor(), mem, handle->GetTensorInfo().GetNumBytes()); break; } #ifdef ARMCOMPUTECL_ENABLED case armnn::ITensorHandle::CL: { using armnn::armcomputetensorutils::CopyArmComputeITensorData; auto handle = boost::polymorphic_downcast(tensorHandle); handle->Map(true); switch(handle->GetDataType()) { case arm_compute::DataType::F32: CopyArmComputeITensorData(static_cast(mem), handle->GetTensor()); break; case arm_compute::DataType::QASYMM8: CopyArmComputeITensorData(static_cast(mem), handle->GetTensor()); break; case arm_compute::DataType::F16: CopyArmComputeITensorData(static_cast(mem), handle->GetTensor()); break; default: { throw armnn::UnimplementedException(); } } handle->Unmap(); break; } #endif #if ARMCOMPUTENEON_ENABLED case armnn::ITensorHandle::Neon: { using armnn::armcomputetensorutils::CopyArmComputeITensorData; auto handle = boost::polymorphic_downcast(tensorHandle); switch (handle->GetDataType()) { case arm_compute::DataType::F32: CopyArmComputeITensorData(static_cast(mem), handle->GetTensor()); break; case arm_compute::DataType::QASYMM8: CopyArmComputeITensorData(static_cast(mem), handle->GetTensor()); break; default: { throw armnn::UnimplementedException(); } } break; } #endif default: { throw armnn::UnimplementedException(); } } } void CopyDataFromITensorHandle(void* mem, const armnn::ITensorHandle* tensorHandle) { switch (tensorHandle->GetType()) { case armnn::ITensorHandle::Cpu: { auto handle = boost::polymorphic_downcast(tensorHandle); memcpy(mem, handle->GetTensor(), handle->GetTensorInfo().GetNumBytes()); break; } #ifdef ARMCOMPUTECL_ENABLED case armnn::ITensorHandle::CL: { using armnn::armcomputetensorutils::CopyArmComputeITensorData; auto handle = boost::polymorphic_downcast(tensorHandle); const_cast(handle)->Map(true); switch(handle->GetDataType()) { case arm_compute::DataType::F32: CopyArmComputeITensorData(handle->GetTensor(), static_cast(mem)); break; case arm_compute::DataType::QASYMM8: CopyArmComputeITensorData(handle->GetTensor(), static_cast(mem)); break; case arm_compute::DataType::F16: CopyArmComputeITensorData(handle->GetTensor(), static_cast(mem)); break; default: { throw armnn::UnimplementedException(); } } const_cast(handle)->Unmap(); break; } #endif #if ARMCOMPUTENEON_ENABLED case armnn::ITensorHandle::Neon: { using armnn::armcomputetensorutils::CopyArmComputeITensorData; auto handle = boost::polymorphic_downcast(tensorHandle); switch (handle->GetDataType()) { case arm_compute::DataType::F32: CopyArmComputeITensorData(handle->GetTensor(), static_cast(mem)); break; case arm_compute::DataType::QASYMM8: CopyArmComputeITensorData(handle->GetTensor(), static_cast(mem)); break; default: { throw armnn::UnimplementedException(); } } break; } #endif default: { throw armnn::UnimplementedException(); } } } void AllocateAndCopyDataToITensorHandle(armnn::ITensorHandle* tensorHandle, const void* mem) { tensorHandle->Allocate(); CopyDataToITensorHandle(tensorHandle, mem); }