From 9e1e183444a2b5b795543cd103288146733437ef Mon Sep 17 00:00:00 2001 From: Vivek Trivedi <5340687+trivedivivek@users.noreply.github.com> Date: Mon, 2 Dec 2024 15:53:30 -0800 Subject: [PATCH] [ET-VK] Store unique ptr to StagingBuffer and SymInt in Value instead of inlined object, to reduce Value struct size from 80 to 32 bytes. This diff aims to reduce the size of the `Value` struct from 80 bytes to 32 bytes by storing a unique pointer to `StagingBuffer` and `SymInt` instead of inlining the objects. Differential Revision: [D66677759](https://our.internmc.facebook.com/intern/diff/D66677759/) [ghstack-poisoned] --- .../vulkan/runtime/graph/containers/Value.h | 39 +++++++++---------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/backends/vulkan/runtime/graph/containers/Value.h b/backends/vulkan/runtime/graph/containers/Value.h index bd8c0c1d5e7..6f88597cabe 100644 --- a/backends/vulkan/runtime/graph/containers/Value.h +++ b/backends/vulkan/runtime/graph/containers/Value.h @@ -59,7 +59,7 @@ struct Value final { } u; std::unique_ptr as_tensor; - api::StagingBuffer as_staging; + std::unique_ptr as_staging; TensorRef as_tensorref; std::vector as_int_list; @@ -73,7 +73,7 @@ struct Value final { std::string as_string; - SymInt as_symint; + std::unique_ptr as_symint; Payload() : u() {} // NOLINTNEXTLINE @@ -117,9 +117,7 @@ struct Value final { CASE_MOVE_TRIVIALLY_COPYABLE_TYPE(TypeTag::INT, as_int); CASE_MOVE_TRIVIALLY_COPYABLE_TYPE(TypeTag::DOUBLE, as_double); CASE_MOVE_TRIVIALLY_COPYABLE_TYPE(TypeTag::BOOL, as_bool); - // Tensor adjacent types - CASE_MOVE_MOVEABLE_TYPE( - TypeTag::STAGING, api::StagingBuffer, as_staging, StagingBuffer); + // Tensor adjacent type CASE_MOVE_MOVEABLE_TYPE( TypeTag::TENSORREF, TensorRef, as_tensorref, TensorRef); // Scalar lists @@ -134,9 +132,10 @@ struct Value final { TypeTag::VALUELIST, std::vector, as_value_list, vector); CASE_MOVE_MOVEABLE_TYPE( TypeTag::STRING, std::string, as_string, basic_string); - CASE_MOVE_MOVEABLE_TYPE(TypeTag::SYMINT, SymInt, as_symint, SymInt); // Tensor type CASE_MOVE_UNIQUE_PTR_TYPE(TypeTag::TENSOR, as_tensor); + CASE_MOVE_UNIQUE_PTR_TYPE(TypeTag::STAGING, as_staging); + CASE_MOVE_UNIQUE_PTR_TYPE(TypeTag::SYMINT, as_symint); case TypeTag::NONE: clearToNone(); @@ -163,9 +162,6 @@ struct Value final { ~Value() { switch (tag) { - case TypeTag::STAGING: - payload.as_staging.~StagingBuffer(); - break; case TypeTag::TENSORREF: payload.as_tensorref.~TensorRef(); break; @@ -184,9 +180,6 @@ struct Value final { case TypeTag::STRING: payload.as_string.~basic_string(); break; - case TypeTag::SYMINT: - payload.as_symint.~SymInt(); - break; // Manually list out the types so that if a type here is added later and // not handled the compiler can catch it. case TypeTag::NONE: @@ -197,6 +190,12 @@ struct Value final { case TypeTag::TENSOR: payload.as_tensor.reset(); break; + case TypeTag::STAGING: + payload.as_staging.reset(); + break; + case TypeTag::SYMINT: + payload.as_symint.reset(); + break; } } @@ -258,12 +257,6 @@ struct Value final { return payload.member_name; \ } - SUPPORT_TRIVIALLY_MOVEABLE_TYPE( - api::StagingBuffer, - Staging, - TypeTag::STAGING, - as_staging); - SUPPORT_TRIVIALLY_MOVEABLE_TYPE( TensorRef, TensorRef, @@ -300,8 +293,6 @@ struct Value final { TypeTag::STRING, as_string); - SUPPORT_TRIVIALLY_MOVEABLE_TYPE(SymInt, SymInt, TypeTag::SYMINT, as_symint); - #undef SUPPORT_TRIVIALLY_MOVEABLE_TYPE #define SUPPORT_UNIQUE_PTR_TYPE(type, type_name, type_tag, member_name) \ @@ -330,6 +321,14 @@ struct Value final { SUPPORT_UNIQUE_PTR_TYPE(api::vTensor, Tensor, TypeTag::TENSOR, as_tensor); + SUPPORT_UNIQUE_PTR_TYPE( + api::StagingBuffer, + Staging, + TypeTag::STAGING, + as_staging); + + SUPPORT_UNIQUE_PTR_TYPE(SymInt, SymInt, TypeTag::SYMINT, as_symint); + #undef SUPPORT_UNIQUE_PTR_TYPE private: