diff options
5 files changed, 77 insertions, 35 deletions
diff --git a/searchlib/src/vespa/searchlib/tensor/tensor_buffer_type_mapper.cpp b/searchlib/src/vespa/searchlib/tensor/tensor_buffer_type_mapper.cpp index ce8cc11026c..44f175be4e7 100644 --- a/searchlib/src/vespa/searchlib/tensor/tensor_buffer_type_mapper.cpp +++ b/searchlib/src/vespa/searchlib/tensor/tensor_buffer_type_mapper.cpp @@ -9,13 +9,13 @@ namespace search::tensor { TensorBufferTypeMapper::TensorBufferTypeMapper() - : _array_sizes(), + : ArrayStoreTypeMapper(), _ops(nullptr) { } TensorBufferTypeMapper::TensorBufferTypeMapper(uint32_t max_small_subspaces_type_id, double grow_factor, TensorBufferOperations* ops) - : _array_sizes(), + : ArrayStoreTypeMapper(), _ops(ops) { _array_sizes.reserve(max_small_subspaces_type_id + 1); @@ -42,29 +42,4 @@ TensorBufferTypeMapper::TensorBufferTypeMapper(uint32_t max_small_subspaces_type TensorBufferTypeMapper::~TensorBufferTypeMapper() = default; -uint32_t -TensorBufferTypeMapper::get_type_id(size_t array_size) const -{ - assert(!_array_sizes.empty()); - auto result = std::lower_bound(_array_sizes.begin() + 1, _array_sizes.end(), array_size); - if (result == _array_sizes.end()) { - return 0; // type id 0 uses LargeSubspacesBufferType - } - return result - _array_sizes.begin(); -} - -size_t -TensorBufferTypeMapper::get_array_size(uint32_t type_id) const -{ - assert(type_id > 0 && type_id < _array_sizes.size()); - return _array_sizes[type_id]; -} - -uint32_t -TensorBufferTypeMapper::get_max_small_array_type_id(uint32_t max_small_array_type_id) const noexcept -{ - auto clamp_type_id = _array_sizes.size() - 1; - return (clamp_type_id < max_small_array_type_id) ? clamp_type_id : max_small_array_type_id; -} - } diff --git a/searchlib/src/vespa/searchlib/tensor/tensor_buffer_type_mapper.h b/searchlib/src/vespa/searchlib/tensor/tensor_buffer_type_mapper.h index ad2116a429c..422224751e3 100644 --- a/searchlib/src/vespa/searchlib/tensor/tensor_buffer_type_mapper.h +++ b/searchlib/src/vespa/searchlib/tensor/tensor_buffer_type_mapper.h @@ -2,9 +2,7 @@ #pragma once -#include <cstddef> -#include <cstdint> -#include <vector> +#include <vespa/vespalib/datastore/array_store_type_mapper.h> namespace search::tensor { @@ -16,9 +14,8 @@ class TensorBufferOperations; * This class provides mapping between type ids and array sizes needed for * storing a tensor. */ -class TensorBufferTypeMapper +class TensorBufferTypeMapper : public vespalib::datastore::ArrayStoreTypeMapper { - std::vector<size_t> _array_sizes; TensorBufferOperations* _ops; public: using SmallBufferType = SmallSubspacesBufferType; @@ -28,10 +25,7 @@ public: TensorBufferTypeMapper(uint32_t max_small_subspaces_type_id, double grow_factor, TensorBufferOperations* ops); ~TensorBufferTypeMapper(); - uint32_t get_type_id(size_t array_size) const; - size_t get_array_size(uint32_t type_id) const; TensorBufferOperations& get_tensor_buffer_operations() const noexcept { return *_ops; } - uint32_t get_max_small_array_type_id(uint32_t max_small_array_type_id) const noexcept; }; } diff --git a/vespalib/src/vespa/vespalib/datastore/CMakeLists.txt b/vespalib/src/vespa/vespalib/datastore/CMakeLists.txt index f11004363f8..1c3b9112dda 100644 --- a/vespalib/src/vespa/vespalib/datastore/CMakeLists.txt +++ b/vespalib/src/vespa/vespalib/datastore/CMakeLists.txt @@ -3,6 +3,7 @@ vespa_add_library(vespalib_vespalib_datastore OBJECT SOURCES array_store.cpp array_store_config.cpp + array_store_type_mapper.cpp atomic_entry_ref.cpp buffer_free_list.cpp buffer_stats.cpp diff --git a/vespalib/src/vespa/vespalib/datastore/array_store_type_mapper.cpp b/vespalib/src/vespa/vespalib/datastore/array_store_type_mapper.cpp new file mode 100644 index 00000000000..ff514f5a00b --- /dev/null +++ b/vespalib/src/vespa/vespalib/datastore/array_store_type_mapper.cpp @@ -0,0 +1,41 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +#include "array_store_type_mapper.h" +#include <algorithm> +#include <cassert> + +namespace vespalib::datastore { + +ArrayStoreTypeMapper::ArrayStoreTypeMapper() + : _array_sizes() +{ +} + +ArrayStoreTypeMapper::~ArrayStoreTypeMapper() = default; + +uint32_t +ArrayStoreTypeMapper::get_type_id(size_t array_size) const +{ + assert(!_array_sizes.empty()); + auto result = std::lower_bound(_array_sizes.begin() + 1, _array_sizes.end(), array_size); + if (result == _array_sizes.end()) { + return 0; // type id 0 uses buffer type for large arrays + } + return result - _array_sizes.begin(); +} + +size_t +ArrayStoreTypeMapper::get_array_size(uint32_t type_id) const +{ + assert(type_id > 0 && type_id < _array_sizes.size()); + return _array_sizes[type_id]; +} + +uint32_t +ArrayStoreTypeMapper::get_max_small_array_type_id(uint32_t max_small_array_type_id) const noexcept +{ + auto clamp_type_id = _array_sizes.size() - 1; + return (clamp_type_id < max_small_array_type_id) ? clamp_type_id : max_small_array_type_id; +} + +} diff --git a/vespalib/src/vespa/vespalib/datastore/array_store_type_mapper.h b/vespalib/src/vespa/vespalib/datastore/array_store_type_mapper.h new file mode 100644 index 00000000000..e707627de19 --- /dev/null +++ b/vespalib/src/vespa/vespalib/datastore/array_store_type_mapper.h @@ -0,0 +1,31 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +#pragma once + +#include <cstddef> +#include <cstdint> +#include <vector> + +namespace vespalib::datastore { + +/* + * This class provides mapping between type ids and array sizes needed for + * storing a value with size smaller than or equal to the array size. + * + * The array sizes vector is a monotic increasing sequence that might end + * with exponential growth. + */ +class ArrayStoreTypeMapper +{ +protected: + std::vector<size_t> _array_sizes; +public: + ArrayStoreTypeMapper(); + ~ArrayStoreTypeMapper(); + + uint32_t get_type_id(size_t array_size) const; + size_t get_array_size(uint32_t type_id) const; + uint32_t get_max_small_array_type_id(uint32_t max_small_array_type_id) const noexcept; +}; + +} |