aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNarumol Prangnawarat <narumol.prangnawarat@arm.com>2021-05-10 11:02:58 +0100
committerNarumol Prangnawarat <narumol.prangnawarat@arm.com>2021-05-10 13:21:43 +0100
commit016e0a5d3369ee9cecec9224245edac43fc653e4 (patch)
treea9d8ae471cb1ffcaddf22beebbeb948d876786cd
parent39954b04bc8ea7ad72f83e95cc5c98e1c32c85cd (diff)
downloadarmnn-016e0a5d3369ee9cecec9224245edac43fc653e4.tar.gz
IVGCVSW-5818 Add dma buf support for memory import on GPU
Signed-off-by: Narumol Prangnawarat <narumol.prangnawarat@arm.com> Change-Id: Ia2d248d882111bb9f502cea4595cfd2569701f5d
-rw-r--r--src/backends/cl/ClImportTensorHandle.hpp61
1 files changed, 38 insertions, 23 deletions
diff --git a/src/backends/cl/ClImportTensorHandle.hpp b/src/backends/cl/ClImportTensorHandle.hpp
index d3c53fa46a..ddd20fc491 100644
--- a/src/backends/cl/ClImportTensorHandle.hpp
+++ b/src/backends/cl/ClImportTensorHandle.hpp
@@ -102,36 +102,26 @@ public:
{
if (source == MemorySource::Malloc)
{
- const size_t totalBytes = m_Tensor.info()->total_size();
-
const cl_import_properties_arm importProperties[] =
{
- CL_IMPORT_TYPE_ARM,
- CL_IMPORT_TYPE_HOST_ARM,
- 0
+ CL_IMPORT_TYPE_ARM,
+ CL_IMPORT_TYPE_HOST_ARM,
+ 0
};
- cl_int error = CL_SUCCESS;
- cl_mem buffer = clImportMemoryARM(arm_compute::CLKernelLibrary::get().context().get(),
- CL_MEM_READ_WRITE, importProperties, memory, totalBytes, &error);
- if (error != CL_SUCCESS)
+ return ClImport(importProperties, memory);
+ }
+ if (source == MemorySource::DmaBuf)
+ {
+ const cl_import_properties_arm importProperties[] =
{
- throw MemoryImportException(
- "ClImportTensorHandle::Invalid imported memory:" + std::to_string(error));
- }
+ CL_IMPORT_TYPE_ARM,
+ CL_IMPORT_TYPE_DMA_BUF_ARM,
+ 0
+ };
- cl::Buffer wrappedBuffer(buffer);
- arm_compute::Status status = m_Tensor.allocator()->import_memory(wrappedBuffer);
+ return ClImport(importProperties, memory);
- // Use the overloaded bool operator of Status to check if it worked, if not throw an exception
- // with the Status error message
- bool imported = (status.error_code() == arm_compute::ErrorCode::OK);
- if (!imported)
- {
- throw MemoryImportException(status.error_description());
- }
- ARMNN_ASSERT(!m_Tensor.info()->is_resizable());
- return imported;
}
else
{
@@ -146,6 +136,31 @@ public:
}
private:
+ bool ClImport(const cl_import_properties_arm* importProperties, void* memory)
+ {
+ const size_t totalBytes = m_Tensor.info()->total_size();
+ cl_int error = CL_SUCCESS;
+ cl_mem buffer = clImportMemoryARM(arm_compute::CLKernelLibrary::get().context().get(),
+ CL_MEM_READ_WRITE, importProperties, memory, totalBytes, &error);
+ if (error != CL_SUCCESS)
+ {
+ throw MemoryImportException("ClImportTensorHandle::Invalid imported memory");
+ }
+
+ cl::Buffer wrappedBuffer(buffer);
+ arm_compute::Status status = m_Tensor.allocator()->import_memory(wrappedBuffer);
+
+ // Use the overloaded bool operator of Status to check if it is success, if not throw an exception
+ // with the Status error message
+ bool imported = (status.error_code() == arm_compute::ErrorCode::OK);
+ if (!imported)
+ {
+ throw MemoryImportException(status.error_description());
+ }
+
+ ARMNN_ASSERT(!m_Tensor.info()->is_resizable());
+ return imported;
+ }
// Only used for testing
void CopyOutTo(void* memory) const override
{