summaryrefslogtreecommitdiffstats
path: root/eval
diff options
context:
space:
mode:
authorArne Juul <arnej@verizonmedia.com>2020-10-21 11:34:07 +0000
committerArne Juul <arnej@verizonmedia.com>2020-10-21 12:10:10 +0000
commitc827a56568d20a1f455a7f9b57addeb658e8efeb (patch)
treecc0a98399c11e91e99e1f39f11421996a700578d /eval
parentb5260ca1781d3aa0a47598c58b2501483be051c7 (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')
-rw-r--r--eval/src/tests/tensor/packed_mappings/packed_mappings_test.cpp3
-rw-r--r--eval/src/vespa/eval/tensor/mixed/packed_labels.cpp2
-rw-r--r--eval/src/vespa/eval/tensor/mixed/packed_labels.h2
-rw-r--r--eval/src/vespa/eval/tensor/mixed/packed_mappings.cpp4
-rw-r--r--eval/src/vespa/eval/tensor/mixed/packed_mappings.h11
-rw-r--r--eval/src/vespa/eval/tensor/mixed/packed_mappings_builder.cpp2
-rw-r--r--eval/src/vespa/eval/tensor/mixed/packed_mixed_tensor.cpp16
-rw-r--r--eval/src/vespa/eval/tensor/mixed/packed_mixed_tensor.h20
-rw-r--r--eval/src/vespa/eval/tensor/mixed/packed_mixed_tensor_builder.cpp5
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;