From fdf56fb9d414a754e7cedfdc1351ab0ce2866a0c Mon Sep 17 00:00:00 2001 From: Viet-Hoa Do Date: Thu, 18 Jan 2024 16:10:46 +0000 Subject: Make GpuWorkloadContext own all tensor info objects * The tensor info objects created by calling create_tensor_info is now solely owned by the context object. The user only receives pointers to those objects. - Internally pointers to tensor info objects are used in various places. It's safer for dynamic fusion to manage these objects directly rather than relying on the users. - The validation test is updated to use the modified API. * Make various changes in dynamic fusion API to make it more friendly (e.g. making some of the objects moveable). Partially resolves: COMPMID-6707 Signed-off-by: Viet-Hoa Do Change-Id: Ifee70e53c05f8e7b72bf9ef123701ff291c5ee80 Reviewed-on: https://review.mlplatform.org/c/ml/ComputeLibrary/+/10990 Tested-by: Arm Jenkins Reviewed-by: Jakub Sujak Comments-Addressed: Arm Jenkins Benchmark: Arm Jenkins --- src/dynamic_fusion/runtime/gpu/cl/ClWorkloadRuntime.cpp | 6 +++++- src/dynamic_fusion/sketch/gpu/GpuWorkloadContext.cpp | 14 +++++++------- src/dynamic_fusion/sketch/gpu/GpuWorkloadContextImpl.h | 8 +++++--- src/dynamic_fusion/sketch/gpu/GpuWorkloadSketch.cpp | 14 +++++++++++++- src/dynamic_fusion/sketch/gpu/GpuWorkloadSketchImpl.h | 13 +++++++++---- 5 files changed, 39 insertions(+), 16 deletions(-) (limited to 'src') diff --git a/src/dynamic_fusion/runtime/gpu/cl/ClWorkloadRuntime.cpp b/src/dynamic_fusion/runtime/gpu/cl/ClWorkloadRuntime.cpp index ba39ff4c9d..3500a0e60d 100644 --- a/src/dynamic_fusion/runtime/gpu/cl/ClWorkloadRuntime.cpp +++ b/src/dynamic_fusion/runtime/gpu/cl/ClWorkloadRuntime.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022-2023 Arm Limited. + * Copyright (c) 2022-2024 Arm Limited. * * SPDX-License-Identifier: MIT * @@ -289,6 +289,10 @@ ClWorkloadRuntime::ClWorkloadRuntime() : _impl{std::make_unique( ClWorkloadRuntime::~ClWorkloadRuntime() = default; +ClWorkloadRuntime::ClWorkloadRuntime(ClWorkloadRuntime &&) = default; + +ClWorkloadRuntime &ClWorkloadRuntime::operator=(ClWorkloadRuntime &&) = default; + Status ClWorkloadRuntime::configure(const GpuWorkloadSketch &sketch) { ARM_COMPUTE_RETURN_ERROR_ON_MSG(_impl->_is_configured, "ClWorkloadRuntime cannot be re-configured"); diff --git a/src/dynamic_fusion/sketch/gpu/GpuWorkloadContext.cpp b/src/dynamic_fusion/sketch/gpu/GpuWorkloadContext.cpp index 36cad790c7..fab18aabb4 100644 --- a/src/dynamic_fusion/sketch/gpu/GpuWorkloadContext.cpp +++ b/src/dynamic_fusion/sketch/gpu/GpuWorkloadContext.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022-2023 Arm Limited. + * Copyright (c) 2022-2024 Arm Limited. * * SPDX-License-Identifier: MIT * @@ -60,9 +60,9 @@ const CLCompileContext *GpuWorkloadContext::cl_compile_context() const return _impl->cl_compile_context(); } -void GpuWorkloadContext::register_user_tensor(ITensorInfo &tensor_info) +void GpuWorkloadContext::register_user_tensor(std::unique_ptr &&tensor_info) { - _impl->register_user_tensor(tensor_info); + _impl->register_user_tensor(std::move(tensor_info)); } GpuWorkloadContext::Impl &GpuWorkloadContext::implementation() @@ -99,17 +99,17 @@ const MemoryDescriptorMap &GpuWorkloadContext::Impl::mem_map() const return _mem_map; } -void GpuWorkloadContext::Impl::register_user_tensor(ITensorInfo &tensor_info) +void GpuWorkloadContext::Impl::register_user_tensor(std::unique_ptr &&tensor_info) { - ARM_COMPUTE_ERROR_ON(tensor_info.has_valid_id()); + ARM_COMPUTE_ERROR_ON(tensor_info->has_valid_id()); const auto tensor_id = next_tensor_id(); - tensor_info.set_id(tensor_id); + tensor_info->set_id(tensor_id); _mem_map[tensor_id] = MemoryDescriptor{MemoryType::User}; // Save a *copy* of the user tensor info in workload context for future reference // Note that this means if the user modifies the @p tensor_info, the change will not be reflected in the context - _managed_tensor_info.emplace(tensor_info.id(), std::make_unique(tensor_info)); + _managed_tensor_info.emplace(tensor_info->id(), std::move(tensor_info)); } ITensorInfo *GpuWorkloadContext::Impl::create_virtual_tensor() diff --git a/src/dynamic_fusion/sketch/gpu/GpuWorkloadContextImpl.h b/src/dynamic_fusion/sketch/gpu/GpuWorkloadContextImpl.h index 7d9699031f..b3571a6480 100644 --- a/src/dynamic_fusion/sketch/gpu/GpuWorkloadContextImpl.h +++ b/src/dynamic_fusion/sketch/gpu/GpuWorkloadContextImpl.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023 Arm Limited. + * Copyright (c) 2023-2024 Arm Limited. * * SPDX-License-Identifier: MIT * @@ -64,9 +64,11 @@ public: /** Set a new ID and register the user tensor info. * - * @param[in, out] tensor_info The tensor info to be registered. + * The ownership of the tensor info object will be transfered to this context object. + * + * @param[in] tensor_info The tensor info to be registered. */ - void register_user_tensor(ITensorInfo &tensor_info); + void register_user_tensor(std::unique_ptr &&tensor_info); /** Create a virtual (see @ref MemoryType) tensor info and save it * diff --git a/src/dynamic_fusion/sketch/gpu/GpuWorkloadSketch.cpp b/src/dynamic_fusion/sketch/gpu/GpuWorkloadSketch.cpp index 973f7c747f..357cb48a84 100644 --- a/src/dynamic_fusion/sketch/gpu/GpuWorkloadSketch.cpp +++ b/src/dynamic_fusion/sketch/gpu/GpuWorkloadSketch.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022-2023 Arm Limited. + * Copyright (c) 2022-2024 Arm Limited. * * SPDX-License-Identifier: MIT * @@ -31,22 +31,34 @@ namespace experimental { namespace dynamic_fusion { + GpuWorkloadSketch::GpuWorkloadSketch(Context *context) : _impl{std::make_unique(context)} { } + GpuWorkloadSketch::~GpuWorkloadSketch() { } +GpuWorkloadSketch::GpuWorkloadSketch(GpuWorkloadSketch &&) = default; + +GpuWorkloadSketch &GpuWorkloadSketch::operator=(GpuWorkloadSketch &&) = default; + const GpuWorkloadSketch::Context *GpuWorkloadSketch::gpu_context() const { return _impl->context(); } +GpuWorkloadSketch::Context *GpuWorkloadSketch::gpu_context() +{ + return _impl->context(); +} + GpuWorkloadSketch::Implementation &GpuWorkloadSketch::implementation() { return *_impl; } + const GpuWorkloadSketch::Implementation &GpuWorkloadSketch::implementation() const { return *_impl; diff --git a/src/dynamic_fusion/sketch/gpu/GpuWorkloadSketchImpl.h b/src/dynamic_fusion/sketch/gpu/GpuWorkloadSketchImpl.h index fea4fe9577..04e294eacc 100644 --- a/src/dynamic_fusion/sketch/gpu/GpuWorkloadSketchImpl.h +++ b/src/dynamic_fusion/sketch/gpu/GpuWorkloadSketchImpl.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022-2023 Arm Limited. + * Copyright (c) 2022-2024 Arm Limited. * * SPDX-License-Identifier: MIT * @@ -21,8 +21,8 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ -#ifndef SRC_DYNAMIC_FUSION_SKETCH_GPU_GPUWORKLOADSKETCHIMPL -#define SRC_DYNAMIC_FUSION_SKETCH_GPU_GPUWORKLOADSKETCHIMPL +#ifndef ACL_SRC_DYNAMIC_FUSION_SKETCH_GPU_GPUWORKLOADSKETCHIMPL_H +#define ACL_SRC_DYNAMIC_FUSION_SKETCH_GPU_GPUWORKLOADSKETCHIMPL_H #include "arm_compute/dynamic_fusion/sketch/gpu/GpuWorkloadSketch.h" #include "arm_compute/dynamic_fusion/sketch/MemoryDescriptor.h" @@ -63,6 +63,11 @@ public: { return _context; } + /** Get workload context */ + Context *context() + { + return _context; + } /** Get component graph */ const GpuKernelComponentGraph &component_graph() const { @@ -126,4 +131,4 @@ private: } // namespace dynamic_fusion } // namespace experimental } // namespace arm_compute -#endif /* SRC_DYNAMIC_FUSION_SKETCH_GPU_GPUWORKLOADSKETCHIMPL */ +#endif // ACL_SRC_DYNAMIC_FUSION_SKETCH_GPU_GPUWORKLOADSKETCHIMPL_H -- cgit v1.2.1