From 5a2bc0169d942f7029d73a3afff1eab18b6f65ef Mon Sep 17 00:00:00 2001 From: SiCong Li Date: Thu, 12 Jan 2023 12:54:49 +0000 Subject: Add Auxiliary tensors The asssign_memory_descriptors method could not automatically assign Auxiliary tensors. Therefore changes are made to allow developers to explicitly mark auxiliary tensors. However, to avoid ambiguity between auxiliary and "intermediate" tensors, we solidify the definitions of both: Intermediate tensors are a strictly topological term. They are defined as "inner" tensors within a workload, hidden from the user, as opposed to input and output tensors exposed to the users. Auxiliary tensors are a subcategory of Intermediate tensors, and are also about memory allocation. They are intermediate tensors that need real memory backing. For more details please see the documentation of MemoryType enum Rename MemoryType::NoAlloc to MemoryType::Virtual Partially resolves: COMPMID-5523 Signed-off-by: SiCong Li Change-Id: Ibde44c2ec1570be9423e0fb38b53bb136ffc36dd Reviewed-on: https://review.mlplatform.org/c/ml/ComputeLibrary/+/8940 Benchmark: Arm Jenkins Tested-by: Arm Jenkins Reviewed-by: Gian Marco Iodice Reviewed-by: Gunes Bayir --- .../dynamic_fusion/sketch/MemoryDescriptor.h | 27 ++++++++++++++++++---- .../dynamic_fusion/sketch/gpu/GpuWorkloadSketch.h | 17 +++++--------- 2 files changed, 29 insertions(+), 15 deletions(-) (limited to 'arm_compute') diff --git a/arm_compute/dynamic_fusion/sketch/MemoryDescriptor.h b/arm_compute/dynamic_fusion/sketch/MemoryDescriptor.h index 25023ff0a1..3daedd4efb 100644 --- a/arm_compute/dynamic_fusion/sketch/MemoryDescriptor.h +++ b/arm_compute/dynamic_fusion/sketch/MemoryDescriptor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Arm Limited. + * Copyright (c) 2022-2023 Arm Limited. * * SPDX-License-Identifier: MIT * @@ -32,12 +32,31 @@ namespace experimental { namespace dynamic_fusion { -/** Type of memory used by a workload tensor */ +/** Type of memory used by a workload tensor + * + * We can classify tensors in 2 dimensions: Topology (where they are in a workload) and Memory allocation: + * Topology: + * Argument tensors: "Outer" tensors exposed to the users as inputs and outputs (arguments) + * Intermediate tensors: "Inner" tensors hidden from the users as links between operators + * Memory allocation: + * Alloc: Tensors that need to be allocated real backing memory + * No-Alloc: Tensors that don't need to be allocated real backing memory + * + * We end up with 3 MemoryType based on the product of these two classifications + * | Argument | Intermediate | + * ---------*----------------*-------------------* + * Alloc | User | Auxiliary | + * ---------*----------------*-------------------* + * No-Alloc * N/A | Virtual | + * ---------*----------------*-------------------* + */ enum class MemoryType { + /** Both User and Auxiliary types are of Alloc type. Since they require memory allocation */ User = 0, /**< Memory coming directly from users, e.g. for argument tensors */ - Auxiliary = 1, /**< Additional memory required by the workload tensor, e.g. for temporary tensors */ - NoAlloc = 2, /**< Temporary tile which is not allocated as a whole tensor in the memory */ + Auxiliary = 1, /**< Additional memory required by the workload tensor, e.g. for tensors holding temporary results between kernels */ + /** Virtual type is of No-Alloc type. Since it doesn't require memory allocation */ + Virtual = 2, /**< Temporary tile which is not allocated as a whole tensor in the memory. It is mainly used at sketch time to link operators; there should be no Virtual tensors at runtime */ }; /** Memory information for tensors with @ref MemoryType::Auxiliary. diff --git a/arm_compute/dynamic_fusion/sketch/gpu/GpuWorkloadSketch.h b/arm_compute/dynamic_fusion/sketch/gpu/GpuWorkloadSketch.h index f19ad6dfc5..422edb35f1 100644 --- a/arm_compute/dynamic_fusion/sketch/gpu/GpuWorkloadSketch.h +++ b/arm_compute/dynamic_fusion/sketch/gpu/GpuWorkloadSketch.h @@ -70,18 +70,9 @@ public: TensorInfo create_tensor_info(Args &&... args) { auto tensor_info = TensorInfo(std::forward(args)...); - tensor_info.set_id(allocate_new_tensor_id()); + register_new_tensor(tensor_info); return tensor_info; } - /** Create a @ref TensorInfo associated with the workload sketch by copying from an existing tensor info - * @note The newly copied tensor will have a different identity within the workload than the one copied from - * To copy the identity of @p tensor_info as well, use @ref TensorInfo 's copy constructors instead - * - * @param[in] tensor_info @ref ITensorInfo to copy from - * - * @return TensorInfo Newly created tensor info - */ - TensorInfo create_tensor_info(const ITensorInfo &tensor_info); /** Create a default @ref TensorInfo associated with the workload sketch * It is usually used by user input or output tensors * @@ -90,7 +81,11 @@ public: TensorInfo create_tensor_info(); private: - ITensorInfo::Id allocate_new_tensor_id(); + /** Register a new tensor by setting a new id to it and register its memory descriptor in the sketch + * + * @param[in,out] tensor_info @ref ITensorInfo that will be registered + */ + void register_new_tensor(ITensorInfo &tensor_info); std::unique_ptr _impl; /**< Internal opaque implementation*/ }; -- cgit v1.2.1