diff options
author | Arne Juul <arnej@verizonmedia.com> | 2020-10-21 11:34:07 +0000 |
---|---|---|
committer | Arne Juul <arnej@verizonmedia.com> | 2020-10-21 12:10:10 +0000 |
commit | c827a56568d20a1f455a7f9b57addeb658e8efeb (patch) | |
tree | cc0a98399c11e91e99e1f39f11421996a700578d /eval | |
parent | b5260ca1781d3aa0a47598c58b2501483be051c7 (diff) |
be more exact in memory accounting
* override the delete with size and forward to
global delete with actually-allocated size,
thereby making it possible for AddressSanitizer
to check our accounting
* unit test explicitly made a float-cell builder for
a double-value, that didn't work out and should not
be allowed
* put alignment adjustment in a common place
* fix off-by-one leftover over-allocation
* memory usage stats are no longer estimates, rename correspondingly
Diffstat (limited to 'eval')
9 files changed, 45 insertions, 20 deletions
diff --git a/eval/src/tests/tensor/packed_mappings/packed_mappings_test.cpp b/eval/src/tests/tensor/packed_mappings/packed_mappings_test.cpp index c8814372bf5..be25dd7f444 100644 --- a/eval/src/tests/tensor/packed_mappings/packed_mappings_test.cpp +++ b/eval/src/tests/tensor/packed_mappings/packed_mappings_test.cpp @@ -35,8 +35,7 @@ const char *float_tensor_types[] = { "tensor<float>(x{},y{})", "tensor<float>(x{},z[3])", "tensor<float>(w[5],x{},y{},z[3])", - "tensor<float>(z[2])", - "tensor<float>()" + "tensor<float>(z[2])" }; vespalib::string label1(""), diff --git a/eval/src/vespa/eval/tensor/mixed/packed_labels.cpp b/eval/src/vespa/eval/tensor/mixed/packed_labels.cpp index a048986c4ac..07c07bbb989 100644 --- a/eval/src/vespa/eval/tensor/mixed/packed_labels.cpp +++ b/eval/src/vespa/eval/tensor/mixed/packed_labels.cpp @@ -38,7 +38,7 @@ PackedLabels::get_label(uint32_t index) const } MemoryUsage -PackedLabels::estimate_extra_memory_usage() const +PackedLabels::extra_memory_usage() const { MemoryUsage extra_usage; size_t offsets_size = _offsets.size() * sizeof(uint32_t); diff --git a/eval/src/vespa/eval/tensor/mixed/packed_labels.h b/eval/src/vespa/eval/tensor/mixed/packed_labels.h index ebe8c7bea7b..86024708568 100644 --- a/eval/src/vespa/eval/tensor/mixed/packed_labels.h +++ b/eval/src/vespa/eval/tensor/mixed/packed_labels.h @@ -33,7 +33,7 @@ public: vespalib::stringref get_label(uint32_t index) const; - MemoryUsage estimate_extra_memory_usage() const; + MemoryUsage extra_memory_usage() const; private: const ConstArrayRef<uint32_t> _offsets; const ConstArrayRef<char> _label_store; diff --git a/eval/src/vespa/eval/tensor/mixed/packed_mappings.cpp b/eval/src/vespa/eval/tensor/mixed/packed_mappings.cpp index c42a77cf384..9a3112f2a4f 100644 --- a/eval/src/vespa/eval/tensor/mixed/packed_mappings.cpp +++ b/eval/src/vespa/eval/tensor/mixed/packed_mappings.cpp @@ -100,12 +100,12 @@ PackedMappings::fill_address_by_sortid(uint32_t internal_index, Address &address } MemoryUsage -PackedMappings::estimate_extra_memory_usage() const +PackedMappings::extra_memory_usage() const { MemoryUsage extra_usage; size_t store_size = _int_store.size() * sizeof(uint32_t); extra_usage.merge(MemoryUsage(store_size, store_size, 0, 0)); - extra_usage.merge(_label_store.estimate_extra_memory_usage()); + extra_usage.merge(_label_store.extra_memory_usage()); return extra_usage; } diff --git a/eval/src/vespa/eval/tensor/mixed/packed_mappings.h b/eval/src/vespa/eval/tensor/mixed/packed_mappings.h index 04e73f0975f..2c9f4b04a00 100644 --- a/eval/src/vespa/eval/tensor/mixed/packed_mappings.h +++ b/eval/src/vespa/eval/tensor/mixed/packed_mappings.h @@ -48,7 +48,8 @@ public: // mapping from label enum to stringref (and vice versa) const PackedLabels & label_store() const { return _label_store; } - MemoryUsage estimate_extra_memory_usage() const; + MemoryUsage extra_memory_usage() const; + private: PackedMappings(uint32_t num_dims, uint32_t num_mappings, ConstArrayRef<uint32_t> int_store, @@ -101,7 +102,13 @@ private: int32_t sortid_of_address(const Address &address) const; int32_t sortid_of_enums(const InternalAddress &address) const; public: - static void operator delete(void* ptr) { ::operator delete(ptr); } + static void operator delete(void *ptr, size_t sz) { + if (sz != sizeof(PackedMappings)) { + abort(); + } + size_t extra = ((const PackedMappings *)ptr)->extra_memory_usage().usedBytes(); + ::operator delete(ptr, sz + extra); + } }; } // namespace diff --git a/eval/src/vespa/eval/tensor/mixed/packed_mappings_builder.cpp b/eval/src/vespa/eval/tensor/mixed/packed_mappings_builder.cpp index 1b3349324ba..abf142f9650 100644 --- a/eval/src/vespa/eval/tensor/mixed/packed_mappings_builder.cpp +++ b/eval/src/vespa/eval/tensor/mixed/packed_mappings_builder.cpp @@ -26,7 +26,7 @@ PackedMappingsBuilder::add_mapping_for(ConstArrayRef<vespalib::stringref> addres size_t PackedMappingsBuilder::extra_memory() const { - size_t int_store_cnt = (2 + _num_dims) * _mappings.size(); + size_t int_store_cnt = (1 + _num_dims) * _mappings.size(); size_t int_store_size = int_store_cnt * sizeof(uint32_t); size_t label_cnt = _labels.size(); size_t label_offsets_size = (1 + label_cnt) * sizeof(uint32_t); diff --git a/eval/src/vespa/eval/tensor/mixed/packed_mixed_tensor.cpp b/eval/src/vespa/eval/tensor/mixed/packed_mixed_tensor.cpp index f1e3b30a026..e22828cbf0c 100644 --- a/eval/src/vespa/eval/tensor/mixed/packed_mixed_tensor.cpp +++ b/eval/src/vespa/eval/tensor/mixed/packed_mixed_tensor.cpp @@ -203,14 +203,26 @@ PackedMixedTensorAllMappings::next_result(ConstArrayRef<vespalib::stringref*> ad /*********************************************************************************/ +PackedMixedTensor::PackedMixedTensor(const ValueType &type, + TypedCells cells, + const PackedMappings &mappings) + : _type(type), + _cells(cells), + _mappings(mappings) +{ + assert(type.cell_type() == _cells.type); +} + PackedMixedTensor::~PackedMixedTensor() = default; MemoryUsage PackedMixedTensor::get_memory_usage() const { MemoryUsage usage = self_memory_usage<PackedMixedTensor>(); - size_t cells_size = typify_invoke<1,TypifyCellType,MySize>(type().cell_type(), cells()); + usage.merge(_mappings.extra_memory_usage()); + size_t plus = add_for_alignment(usage.usedBytes()); + usage.merge(MemoryUsage(plus, plus, 0, 0)); + size_t cells_size = typify_invoke<1,TypifyCellType,MySize>(_cells.type, _cells); usage.merge(MemoryUsage(cells_size, cells_size, 0, 0)); - usage.merge(_mappings.estimate_extra_memory_usage()); return usage; } diff --git a/eval/src/vespa/eval/tensor/mixed/packed_mixed_tensor.h b/eval/src/vespa/eval/tensor/mixed/packed_mixed_tensor.h index 3c448af7d76..013d2d7e07c 100644 --- a/eval/src/vespa/eval/tensor/mixed/packed_mixed_tensor.h +++ b/eval/src/vespa/eval/tensor/mixed/packed_mixed_tensor.h @@ -27,11 +27,7 @@ private: PackedMixedTensor(const ValueType &type, TypedCells cells, - const PackedMappings &mappings) - : _type(type), - _cells(cells), - _mappings(mappings) - {} + const PackedMappings &mappings); template<typename T> friend class PackedMixedTensorBuilder; @@ -48,7 +44,19 @@ public: // Value::Index API: size_t size() const override { return _mappings.size(); } std::unique_ptr<View> create_view(const std::vector<size_t> &dims) const override; - static void operator delete(void* ptr) { ::operator delete(ptr); } + + // memory management: + static size_t add_for_alignment(size_t sz) { + size_t unalign = sz & 15; + return (unalign == 0) ? unalign : (16 - unalign); + } + static void operator delete(void *ptr, size_t sz) { + if (sz != sizeof(PackedMixedTensor)) { + abort(); + } + size_t allocated_sz = ((PackedMixedTensor *)ptr)->get_memory_usage().usedBytes(); + ::operator delete(ptr, allocated_sz); + } }; } // namespace diff --git a/eval/src/vespa/eval/tensor/mixed/packed_mixed_tensor_builder.cpp b/eval/src/vespa/eval/tensor/mixed/packed_mixed_tensor_builder.cpp index e419673ee22..dff1f3cbd21 100644 --- a/eval/src/vespa/eval/tensor/mixed/packed_mixed_tensor_builder.cpp +++ b/eval/src/vespa/eval/tensor/mixed/packed_mixed_tensor_builder.cpp @@ -25,9 +25,8 @@ PackedMixedTensorBuilder<T>::build(std::unique_ptr<ValueBuilder<T>>) { size_t self_size = sizeof(PackedMixedTensor); size_t mappings_size = _mappings_builder.extra_memory(); - // align: - mappings_size += 15ul; - mappings_size &= ~15ul; + // align cells: + mappings_size += PackedMixedTensor::add_for_alignment(self_size + mappings_size); size_t cells_size = sizeof(T) * _cells.size(); size_t total_size = self_size + mappings_size + cells_size; |