From 856f66e6c61b77d03f754cd0fa8439891f0e4aca Mon Sep 17 00:00:00 2001 From: Georgios Pinitas Date: Thu, 22 Apr 2021 21:13:21 +0100 Subject: Port CLGEMM to memory injecting interface Moves the following kernels: - CLGEMMMatrixMultiplyKernel - CLGEMMMatrixMultiplyNativeKernel - CLGEMMMatrixMultipluReshapedKernel - CLGEMMMatrixMultiplyReshapedOnlyRHSKernel Moves the following functions - CLGEMM Introduces facilities to easy handling of auxiliary temporary buffers under then new run interface. Such are: - CLAuxTensorHandler: That allows wrapping of workspace buffers memory to CLBuffer objects - Ability to inject TensorInfo to allocator without transferring ownership. This reduce the copy overhead if needed. Resolves: COMPMID-4188 Signed-off-by: Georgios Pinitas Change-Id: I7055435d831b05b749b26302082e4ac45f26dfb0 Reviewed-on: https://review.mlplatform.org/c/ml/ComputeLibrary/+/5498 Tested-by: Arm Jenkins Reviewed-by: Michalis Spyrou Comments-Addressed: Arm Jenkins --- src/core/helpers/MemoryHelpers.h | 86 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 src/core/helpers/MemoryHelpers.h (limited to 'src/core/helpers') diff --git a/src/core/helpers/MemoryHelpers.h b/src/core/helpers/MemoryHelpers.h new file mode 100644 index 0000000000..6756a90c25 --- /dev/null +++ b/src/core/helpers/MemoryHelpers.h @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2021 Arm Limited. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +#ifndef SRC_COMMON_MEMORY_HELPERS_H +#define SRC_COMMON_MEMORY_HELPERS_H + +#include "arm_compute/core/ITensorPack.h" +#include "arm_compute/core/TensorInfo.h" +#include "arm_compute/core/experimental/Types.h" +#include "arm_compute/runtime/MemoryGroup.h" + +#include +#include +#include + +namespace arm_compute +{ +inline int offset_int_vec(int offset) +{ + return ACL_INT_VEC + offset; +} + +template +using WorkspaceData = std::vector>>; + +template +WorkspaceData manage_workspace(const experimental::MemoryRequirements &mem_reqs, + MemoryGroup &mgroup, + ITensorPack &run_pack, ITensorPack &prep_pack) +{ + WorkspaceData workspace_memory; + for(const auto &req : mem_reqs) + { + if(req.size == 0) + { + continue; + } + + const auto aux_info = TensorInfo{ TensorShape(req.size), 1, DataType::U8 }; + workspace_memory.emplace_back(req.slot, std::make_unique()); + + auto aux_tensor = workspace_memory.back().second.get(); + ARM_COMPUTE_ERROR_ON_NULLPTR(aux_tensor); + aux_tensor->allocator()->init(aux_info); + + if(req.lifetime == experimental::MemoryLifetime::Temporary) + { + mgroup.manage(aux_tensor); + } + else + { + prep_pack.add_tensor(req.slot, aux_tensor); + } + run_pack.add_tensor(req.slot, aux_tensor); + } + + for(auto &mem : workspace_memory) + { + auto tensor = mem.second.get(); + tensor->allocator()->allocate(); + } + + return workspace_memory; +} +} // namespace arm_compute +#endif /* SRC_COMMON_MEMORY_HELPERS_H */ -- cgit v1.2.1