diff options
author | Arne H Juul <arnej27959@users.noreply.github.com> | 2020-12-02 18:24:00 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-12-02 18:24:00 +0100 |
commit | 3eae4340b40e7551db5e55ca3ef4113bed59f4d4 (patch) | |
tree | 6a54b3ce601913c832d7f0dbf8fc7bdbdd3383b2 /searchlib | |
parent | 4d4c4fb9c9a3d34c0b419b260e1381a8fbb88181 (diff) | |
parent | f4f2f7c0b2fb2bb0f4d5819699c8ad923c832876 (diff) |
Merge pull request #15593 from vespa-engine/arnej/no-padding-needed
Arnej/no padding needed
Diffstat (limited to 'searchlib')
-rw-r--r-- | searchlib/src/vespa/searchlib/tensor/streamed_value_store.cpp | 32 | ||||
-rw-r--r-- | searchlib/src/vespa/searchlib/tensor/streamed_value_store.h | 6 |
2 files changed, 14 insertions, 24 deletions
diff --git a/searchlib/src/vespa/searchlib/tensor/streamed_value_store.cpp b/searchlib/src/vespa/searchlib/tensor/streamed_value_store.cpp index ae2e0e7ed10..c4579880409 100644 --- a/searchlib/src/vespa/searchlib/tensor/streamed_value_store.cpp +++ b/searchlib/src/vespa/searchlib/tensor/streamed_value_store.cpp @@ -34,17 +34,12 @@ struct CellsMemBlock { }; template<typename T> -T *fix_alignment(T *ptr, size_t align) +void check_alignment(T *ptr, size_t align) { static_assert(sizeof(T) == 1); - assert((align & (align-1)) == 0); // must be 2^N size_t ptr_val = (size_t)ptr; size_t unalign = ptr_val & (align - 1); - if (unalign == 0) { - return ptr; - } else { - return ptr + (align - unalign); - } + assert(unalign == 0); } } // namespace <unnamed> @@ -60,6 +55,11 @@ StreamedValueStore::StreamedValueStore(const ValueType &tensor_type) { _store.addType(&_bufferType); _store.initActiveBuffers(); + size_t align = CellTypeUtils::alignment(_data_from_type.cell_type); + // max alignment we can handle is 8: + assert(align <= 8); + // alignment must be a power of two: + assert((align & (align-1)) == 0); } StreamedValueStore::~StreamedValueStore() @@ -132,17 +132,12 @@ StreamedValueStore::get_tensor_data(EntryRef ref) const } vespalib::nbostream source(raw.first, raw.second); uint32_t num_cells = source.readValue<uint32_t>(); - { - uint32_t alignment = CellTypeUtils::alignment(_data_from_type.cell_type); - const char *aligned_ptr = fix_alignment(source.peek(), alignment); - size_t adjustment = aligned_ptr - source.peek(); - source.adjustReadPos(adjustment); - } + check_alignment(source.peek(), CellTypeUtils::alignment(_data_from_type.cell_type)); retval.cells_ref = TypedCells(source.peek(), _data_from_type.cell_type, num_cells); source.adjustReadPos(CellTypeUtils::mem_size(_data_from_type.cell_type, num_cells)); - retval.num_subspaces = source.readValue<uint32_t>(); + assert((num_cells % _data_from_type.dense_subspace_size) == 0); + retval.num_subspaces = num_cells / _data_from_type.dense_subspace_size; retval.labels_buffer = vespalib::ConstArrayRef<char>(source.peek(), source.size()); - assert(retval.num_subspaces * _data_from_type.dense_subspace_size == num_cells); retval.valid = true; return retval; } @@ -166,7 +161,6 @@ StreamedValueStore::serialize_labels(const Value::Index &index, vespalib::nbostream &target) const { uint32_t num_subspaces = index.size(); - target << num_subspaces; uint32_t num_mapped_dims = _data_from_type.num_mapped_dimensions; std::vector<vespalib::stringref> labels(num_mapped_dims * num_subspaces); auto view = index.create_view({}); @@ -197,18 +191,16 @@ StreamedValueStore::store_tensor(const Value &tensor) { assert(tensor.type() == _tensor_type); CellsMemBlock cells_mem(tensor.cells()); - size_t alignment = CellTypeUtils::alignment(_data_from_type.cell_type); - size_t padding = alignment - 1; vespalib::nbostream stream; stream << uint32_t(cells_mem.num); serialize_labels(tensor.index(), stream); - size_t mem_size = stream.size() + cells_mem.total_sz + padding; + size_t mem_size = stream.size() + cells_mem.total_sz; auto raw = allocRawBuffer(mem_size); char *target = raw.data; memcpy(target, stream.peek(), sizeof(uint32_t)); stream.adjustReadPos(sizeof(uint32_t)); target += sizeof(uint32_t); - target = fix_alignment(target, alignment); + check_alignment(target, CellTypeUtils::alignment(_data_from_type.cell_type)); memcpy(target, cells_mem.ptr, cells_mem.total_sz); target += cells_mem.total_sz; memcpy(target, stream.peek(), stream.size()); diff --git a/searchlib/src/vespa/searchlib/tensor/streamed_value_store.h b/searchlib/src/vespa/searchlib/tensor/streamed_value_store.h index 4e12296916d..de94dc043d3 100644 --- a/searchlib/src/vespa/searchlib/tensor/streamed_value_store.h +++ b/searchlib/src/vespa/searchlib/tensor/streamed_value_store.h @@ -21,7 +21,7 @@ namespace search::tensor { * - number of mapped dimensions [MD] * - dense subspace size [DS] * - size of each cell [CS] - currently 4 (float) or 8 (double) - * - alignment for cells [CA] - currently 4 (float) or 8 (double) + * - alignment for cells - currently 4 (float) or 8 (double) * While the tensor value to be serialized has: * - number of dense subspaces [ND] * - labels for dense subspaces, ND * MD strings @@ -30,10 +30,8 @@ namespace search::tensor { * * [bytes] : [format] : [description] * 4 : n.b.o. uint32_ t : num cells = ND * DS - * 1-7 : (none) : padding to cell alignment CA * CS * ND * DS : native float or double : cells - * 4 : n.b.o. uint32_t : number of subspaces = ND - * (depends) : n.b.o. strings : labels + * (depends) : n.b.o. strings : ND * MD label strings * * Here, n.b.o. means network byte order, or more precisely * it's the format vespalib::nbostream uses for the given data type, |