diff options
Diffstat (limited to 'searchlib')
23 files changed, 126 insertions, 135 deletions
diff --git a/searchlib/src/tests/features/tensor/tensor_test.cpp b/searchlib/src/tests/features/tensor/tensor_test.cpp index b097f27342d..abe54906791 100644 --- a/searchlib/src/tests/features/tensor/tensor_test.cpp +++ b/searchlib/src/tests/features/tensor/tensor_test.cpp @@ -16,6 +16,7 @@ #include <vespa/eval/tensor/default_tensor_engine.h> #include <vespa/eval/tensor/serialization/typed_binary_format.h> #include <vespa/eval/tensor/tensor_factory.h> +#include <vespa/eval/tensor/test/test_utils.h> #include <vespa/vespalib/objects/nbostream.h> using search::feature_t; @@ -36,6 +37,7 @@ using vespalib::tensor::Tensor; using vespalib::tensor::TensorCells; using vespalib::tensor::TensorDimensions; using vespalib::tensor::TensorFactory; +using vespalib::tensor::test::makeTensor; using AVC = search::attribute::Config; using AVBT = search::attribute::BasicType; @@ -47,19 +49,8 @@ using CollectionType = FieldInfo::CollectionType; namespace { -Tensor::UP createTensor(const TensorCells &cells, - const TensorDimensions &dimensions) { - vespalib::tensor::DefaultTensor::builder builder; - return TensorFactory::create(cells, dimensions, builder); -} - -Tensor::UP make_tensor(const TensorSpec &spec) { - auto tensor = DefaultTensorEngine::ref().from_spec(spec); - return Tensor::UP(dynamic_cast<Tensor*>(tensor.release())); -} - Tensor::UP make_empty(const vespalib::string &type) { - return make_tensor(TensorSpec(type)); + return makeTensor<Tensor>(TensorSpec(type)); } } @@ -118,21 +109,18 @@ struct ExecFixture TensorAttribute *tensorAttr = dynamic_cast<TensorAttribute *>(attrs[0].get()); - tensorAttr->setTensor(1, *createTensor({ {{{"x", "a"}}, 3}, - {{{"x", "b"}}, 5}, - {{{"x", "c"}}, 7} }, - { "x" })); - + tensorAttr->setTensor(1, *makeTensor<Tensor>(TensorSpec("tensor(x{})") + .add({{"x", "a"}}, 3) + .add({{"x", "b"}}, 5) + .add({{"x", "c"}}, 7))); for (const auto &attr : attrs) { attr->commit(); } } void setQueryTensor(const vespalib::string &tensorName, const vespalib::string &tensorTypeSpec, - const TensorCells &cells, - const TensorDimensions &dimensions) + std::unique_ptr<Tensor> tensor) { - auto tensor = createTensor(cells, dimensions); vespalib::nbostream stream; vespalib::tensor::TypedBinaryFormat::serialize(stream, *tensor); test.getQueryEnv().getProperties().add(tensorName, @@ -143,16 +131,16 @@ struct ExecFixture void setupQueryEnvironment() { setQueryTensor("tensorquery", "tensor(q{})", - { {{{"q", "d"}}, 11 }, - {{{"q", "e"}}, 13 }, - {{{"q", "f"}}, 17 } }, - { "q" }); + makeTensor<Tensor>(TensorSpec("tensor(q{})") + .add({{"q", "d"}}, 11 ) + .add({{"q", "e"}}, 13 ) + .add({{"q", "f"}}, 17 ))); setQueryTensor("mappedtensorquery", "tensor(x[2])", - { {{{"x", "0"},{"y", "0"}}, 11 }, - {{{"x", "0"},{"y", "1"}}, 13 }, - {{{"x", "1"},{"y", "0"}}, 17 } }, - { "x", "y" }); + makeTensor<Tensor>(TensorSpec("tensor(x{},y{})") + .add({{"x", "0"},{"y", "0"}}, 11 ) + .add({{"x", "0"},{"y", "1"}}, 13 ) + .add({{"x", "1"},{"y", "0"}}, 17 ))); setQueryTensorType("null", "tensor(q{})"); } const Tensor &extractTensor(uint32_t docid) { @@ -168,19 +156,19 @@ struct ExecFixture TEST_F("require that tensor attribute can be extracted as tensor in attribute feature", ExecFixture("attribute(tensorattr)")) { - EXPECT_EQUAL(*make_tensor(TensorSpec("tensor(x{})") - .add({{"x", "b"}}, 5) - .add({{"x", "c"}}, 7) - .add({{"x", "a"}}, 3)), f.execute()); + EXPECT_EQUAL(*makeTensor<Tensor>(TensorSpec("tensor(x{})") + .add({{"x", "b"}}, 5) + .add({{"x", "c"}}, 7) + .add({{"x", "a"}}, 3)), f.execute()); } TEST_F("require that tensor from query can be extracted as tensor in query feature", ExecFixture("query(tensorquery)")) { - EXPECT_EQUAL(*make_tensor(TensorSpec("tensor(q{})") - .add({{"q", "f"}}, 17) - .add({{"q", "d"}}, 11) - .add({{"q", "e"}}, 13)), f.execute()); + EXPECT_EQUAL(*makeTensor<Tensor>(TensorSpec("tensor(q{})") + .add({{"q", "f"}}, 17) + .add({{"q", "d"}}, 11) + .add({{"q", "e"}}, 13)), f.execute()); } TEST_F("require that empty tensor is created if attribute does not exists", @@ -206,11 +194,11 @@ TEST_F("require that empty tensor with correct type is created if document has n EXPECT_EQUAL(*make_empty("tensor(x{})"), f.execute(2)); } -TEST_F("require that tensor from query is mapped", +TEST_F("require that wrong tensor type from query tensor gives empty tensor", ExecFixture("query(mappedtensorquery)")) { - EXPECT_EQUAL(*make_tensor(TensorSpec("tensor(x[2])") - .add({{"x", 0}}, 24) - .add({{"x", 1}}, 17)), f.execute()); + EXPECT_EQUAL(*makeTensor<Tensor>(TensorSpec("tensor(x[2])") + .add({{"x", 0}}, 0) + .add({{"x", 1}}, 0)), f.execute()); } TEST_MAIN() { TEST_RUN_ALL(); } diff --git a/searchlib/src/tests/memoryindex/datastore/featurestore_test.cpp b/searchlib/src/tests/memoryindex/datastore/featurestore_test.cpp index e62cf931be1..dc061f55732 100644 --- a/searchlib/src/tests/memoryindex/datastore/featurestore_test.cpp +++ b/searchlib/src/tests/memoryindex/datastore/featurestore_test.cpp @@ -102,7 +102,7 @@ Test::requireThatFeaturesCanBeAddedAndRetrieved() FeatureStore::RefType(r1).offset()); EXPECT_EQUAL(0u, FeatureStore::RefType(r1).bufferId()); LOG(info, - "bits(%" PRIu64 "), ref.offset(%" PRIu64 "), ref.bufferId(%u)", + "bits(%" PRIu64 "), ref.offset(%zu), ref.bufferId(%u)", r.second, FeatureStore::RefType(r1).offset(), FeatureStore::RefType(r1).bufferId()); @@ -119,7 +119,7 @@ Test::requireThatFeaturesCanBeAddedAndRetrieved() FeatureStore::RefType(r1).offset()); EXPECT_EQUAL(0u, FeatureStore::RefType(r1).bufferId()); LOG(info, - "bits(%" PRIu64 "), ref.offset(%" PRIu64 "), ref.bufferId(%u)", + "bits(%" PRIu64 "), ref.offset(%zu), ref.bufferId(%u)", r.second, FeatureStore::RefType(r2).offset(), FeatureStore::RefType(r2).bufferId()); @@ -146,7 +146,7 @@ Test::requireThatNextWordsAreWorking() FeatureStore::RefType(r1).offset()); EXPECT_EQUAL(0u, FeatureStore::RefType(r1).bufferId()); LOG(info, - "bits(%" PRIu64 "), ref.offset(%" PRIu64 "), ref.bufferId(%u)", + "bits(%" PRIu64 "), ref.offset(%zu), ref.bufferId(%u)", r.second, FeatureStore::RefType(r1).offset(), FeatureStore::RefType(r1).bufferId()); @@ -163,7 +163,7 @@ Test::requireThatNextWordsAreWorking() FeatureStore::RefType(r1).offset()); EXPECT_EQUAL(0u, FeatureStore::RefType(r1).bufferId()); LOG(info, - "bits(%" PRIu64 "), ref.offset(%" PRIu64 "), ref.bufferId(%u)", + "bits(%" PRIu64 "), ref.offset(%zu), ref.bufferId(%u)", r.second, FeatureStore::RefType(r2).offset(), FeatureStore::RefType(r2).bufferId()); diff --git a/searchlib/src/tests/memoryindex/dictionary/dictionary_test.cpp b/searchlib/src/tests/memoryindex/dictionary/dictionary_test.cpp index c461fe32d77..2c4fdc35ac6 100644 --- a/searchlib/src/tests/memoryindex/dictionary/dictionary_test.cpp +++ b/searchlib/src/tests/memoryindex/dictionary/dictionary_test.cpp @@ -1013,8 +1013,8 @@ TEST_F("requireThatInversionIsWorking", DictionaryFixture<Fixture>) f._pushThreads.sync(); DataStoreBase::MemStats beforeStats = getFeatureStoreMemStats(f._d); LOG(info, - "Before feature compaction: allocElems=%" PRIu64 ", usedElems=%" PRIu64 - ", deadElems=%" PRIu64 ", holdElems=%" PRIu64 + "Before feature compaction: allocElems=%zu, usedElems=%zu" + ", deadElems=%zu, holdElems=%zu" ", freeBuffers=%u, activeBuffers=%u" ", holdBuffers=%u", beforeStats._allocElems, @@ -1033,8 +1033,8 @@ TEST_F("requireThatInversionIsWorking", DictionaryFixture<Fixture>) myCommit(f._d, f._pushThreads); DataStoreBase::MemStats duringStats = getFeatureStoreMemStats(f._d); LOG(info, - "During feature compaction: allocElems=%" PRIu64 ", usedElems=%" PRIu64 - ", deadElems=%" PRIu64 ", holdElems=%" PRIu64 + "During feature compaction: allocElems=%zu, usedElems=%zu" + ", deadElems=%zu, holdElems=%zu" ", freeBuffers=%u, activeBuffers=%u" ", holdBuffers=%u", duringStats._allocElems, @@ -1048,8 +1048,8 @@ TEST_F("requireThatInversionIsWorking", DictionaryFixture<Fixture>) myCommit(f._d, f._pushThreads); DataStoreBase::MemStats afterStats = getFeatureStoreMemStats(f._d); LOG(info, - "After feature compaction: allocElems=%" PRIu64 ", usedElems=%" PRIu64 - ", deadElems=%" PRIu64 ", holdElems=%" PRIu64 + "After feature compaction: allocElems=%zu, usedElems=%zu" + ", deadElems=%zu, holdElems=%zu" ", freeBuffers=%u, activeBuffers=%u" ", holdBuffers=%u", afterStats._allocElems, diff --git a/searchlib/src/vespa/searchlib/attribute/enumstorebase.h b/searchlib/src/vespa/searchlib/attribute/enumstorebase.h index 48fbdd69ea1..7615592a798 100644 --- a/searchlib/src/vespa/searchlib/attribute/enumstorebase.h +++ b/searchlib/src/vespa/searchlib/attribute/enumstorebase.h @@ -212,16 +212,16 @@ protected: class EnumBufferType : public datastore::BufferType<char> { private: - uint64_t _minSizeNeeded; // lower cap for sizeNeeded - uint64_t _deadElems; // dead elements in active buffer - bool _pendingCompact; - bool _wantCompact; + size_t _minSizeNeeded; // lower cap for sizeNeeded + size_t _deadElems; // dead elements in active buffer + bool _pendingCompact; + bool _wantCompact; public: EnumBufferType(); size_t calcArraysToAlloc(uint32_t bufferId, size_t sizeNeeded, bool resizing) const override; - void setSizeNeededAndDead(uint64_t sizeNeeded, uint64_t deadElems) { + void setSizeNeededAndDead(size_t sizeNeeded, size_t deadElems) { _minSizeNeeded = sizeNeeded; _deadElems = deadElems; } diff --git a/searchlib/src/vespa/searchlib/btree/btreenodestore.h b/searchlib/src/vespa/searchlib/btree/btreenodestore.h index 42f8929b130..28d0297d554 100644 --- a/searchlib/src/vespa/searchlib/btree/btreenodestore.h +++ b/searchlib/src/vespa/searchlib/btree/btreenodestore.h @@ -33,7 +33,7 @@ public: void initializeReservedElements(void *buffer, size_t reservedElements) override; - void cleanHold(void *buffer, uint64_t offset, uint64_t len, CleanContext cleanCtx) override; + void cleanHold(void *buffer, size_t offset, size_t numElems, CleanContext cleanCtx) override; }; diff --git a/searchlib/src/vespa/searchlib/btree/btreenodestore.hpp b/searchlib/src/vespa/searchlib/btree/btreenodestore.hpp index 333db203175..cf2889c42af 100644 --- a/searchlib/src/vespa/searchlib/btree/btreenodestore.hpp +++ b/searchlib/src/vespa/searchlib/btree/btreenodestore.hpp @@ -22,10 +22,10 @@ BTreeNodeBufferType<EntryType>::initializeReservedElements(void *buffer, size_t template <typename EntryType> void -BTreeNodeBufferType<EntryType>::cleanHold(void *buffer, uint64_t offset, uint64_t len, CleanContext) +BTreeNodeBufferType<EntryType>::cleanHold(void *buffer, size_t offset, size_t numElems, CleanContext) { EntryType *e = static_cast<EntryType *>(buffer) + offset; - for (size_t j = len; j != 0; --j) { + for (size_t j = numElems; j != 0; --j) { e->cleanFrozen(); ++e; } diff --git a/searchlib/src/vespa/searchlib/datastore/array_store.h b/searchlib/src/vespa/searchlib/datastore/array_store.h index 749e567a6ce..b4cc7d4eb59 100644 --- a/searchlib/src/vespa/searchlib/datastore/array_store.h +++ b/searchlib/src/vespa/searchlib/datastore/array_store.h @@ -39,7 +39,7 @@ private: using CleanContext = typename ParentType::CleanContext; public: LargeArrayType(const AllocSpec &spec); - virtual void cleanHold(void *buffer, uint64_t offset, uint64_t len, CleanContext cleanCtx) override; + virtual void cleanHold(void *buffer, size_t offset, size_t numElems, CleanContext cleanCtx) override; }; diff --git a/searchlib/src/vespa/searchlib/datastore/array_store.hpp b/searchlib/src/vespa/searchlib/datastore/array_store.hpp index 6867593518d..7efaaa541cb 100644 --- a/searchlib/src/vespa/searchlib/datastore/array_store.hpp +++ b/searchlib/src/vespa/searchlib/datastore/array_store.hpp @@ -17,10 +17,10 @@ ArrayStore<EntryT, RefT>::LargeArrayType::LargeArrayType(const AllocSpec &spec) template <typename EntryT, typename RefT> void -ArrayStore<EntryT, RefT>::LargeArrayType::cleanHold(void *buffer, uint64_t offset, uint64_t len, CleanContext cleanCtx) +ArrayStore<EntryT, RefT>::LargeArrayType::cleanHold(void *buffer, size_t offset, size_t numElems, CleanContext cleanCtx) { LargeArray *elem = static_cast<LargeArray *>(buffer) + offset; - for (size_t i = 0; i < len; ++i) { + for (size_t i = 0; i < numElems; ++i) { cleanCtx.extraBytesCleaned(sizeof(EntryT) * elem->size()); *elem = _emptyEntry; ++elem; diff --git a/searchlib/src/vespa/searchlib/datastore/buffer_type.cpp b/searchlib/src/vespa/searchlib/datastore/buffer_type.cpp index 157a73ddc20..3955a6cb399 100644 --- a/searchlib/src/vespa/searchlib/datastore/buffer_type.cpp +++ b/searchlib/src/vespa/searchlib/datastore/buffer_type.cpp @@ -13,7 +13,7 @@ constexpr float DEFAULT_ALLOC_GROW_FACTOR = 0.2; } void -BufferTypeBase::CleanContext::extraBytesCleaned(uint64_t value) +BufferTypeBase::CleanContext::extraBytesCleaned(size_t value) { assert(_extraBytes >= value); _extraBytes -= value; diff --git a/searchlib/src/vespa/searchlib/datastore/buffer_type.h b/searchlib/src/vespa/searchlib/datastore/buffer_type.h index 55a394b986a..116b45fe106 100644 --- a/searchlib/src/vespa/searchlib/datastore/buffer_type.h +++ b/searchlib/src/vespa/searchlib/datastore/buffer_type.h @@ -32,10 +32,10 @@ protected: public: class CleanContext { private: - uint64_t &_extraBytes; + size_t &_extraBytes; public: - CleanContext(uint64_t &extraBytes) : _extraBytes(extraBytes) {} - void extraBytesCleaned(uint64_t value); + CleanContext(size_t &extraBytes) : _extraBytes(extraBytes) {} + void extraBytesCleaned(size_t value); }; BufferTypeBase(const BufferTypeBase &rhs) = delete; @@ -53,7 +53,7 @@ public: // Initialize reserved elements at start of buffer. virtual void initializeReservedElements(void *buffer, size_t reservedElements) = 0; virtual size_t elementSize() const = 0; - virtual void cleanHold(void *buffer, uint64_t offset, uint64_t numElems, CleanContext cleanCtx) = 0; + virtual void cleanHold(void *buffer, size_t offset, size_t numElems, CleanContext cleanCtx) = 0; size_t getArraySize() const { return _arraySize; } void flushLastUsed(); virtual void onActive(uint32_t bufferId, size_t *usedElems, size_t &deadElems, void *buffer); @@ -91,7 +91,7 @@ public: void destroyElements(void *buffer, size_t numElems) override; void fallbackCopy(void *newBuffer, const void *oldBuffer, size_t numElems) override; void initializeReservedElements(void *buffer, size_t reservedElements) override; - void cleanHold(void *buffer, uint64_t offset, uint64_t numElems, CleanContext cleanCxt) override; + void cleanHold(void *buffer, size_t offset, size_t numElems, CleanContext cleanCxt) override; size_t elementSize() const override { return sizeof(EntryType); } }; @@ -150,7 +150,7 @@ BufferType<EntryType>::initializeReservedElements(void *buffer, size_t reservedE template <typename EntryType> void -BufferType<EntryType>::cleanHold(void *buffer, uint64_t offset, uint64_t numElems, CleanContext) +BufferType<EntryType>::cleanHold(void *buffer, size_t offset, size_t numElems, CleanContext) { EntryType *e = static_cast<EntryType *>(buffer) + offset; for (size_t j = numElems; j != 0; --j) { diff --git a/searchlib/src/vespa/searchlib/datastore/bufferstate.cpp b/searchlib/src/vespa/searchlib/datastore/bufferstate.cpp index 3424546a79f..638117c8c60 100644 --- a/searchlib/src/vespa/searchlib/datastore/bufferstate.cpp +++ b/searchlib/src/vespa/searchlib/datastore/bufferstate.cpp @@ -271,7 +271,7 @@ BufferState::disableElemHoldList() void BufferState::fallbackResize(uint32_t bufferId, - uint64_t elementsNeeded, + size_t elementsNeeded, void *&buffer, Alloc &holdBuffer) { diff --git a/searchlib/src/vespa/searchlib/datastore/bufferstate.h b/searchlib/src/vespa/searchlib/datastore/bufferstate.h index 696568720c0..1cc26d8dd18 100644 --- a/searchlib/src/vespa/searchlib/datastore/bufferstate.h +++ b/searchlib/src/vespa/searchlib/datastore/bufferstate.h @@ -45,10 +45,10 @@ public: private: size_t _usedElems; size_t _allocElems; - uint64_t _deadElems; + size_t _deadElems; State _state; bool _disableElemHoldList; - uint64_t _holdElems; + size_t _holdElems; // Number of bytes that are heap allocated by elements that are stored in this buffer. // For simple types this is 0. size_t _extraUsedBytes; @@ -142,23 +142,23 @@ public: size_t size() const { return _usedElems; } size_t capacity() const { return _allocElems; } size_t remaining() const { return _allocElems - _usedElems; } - void pushed_back(uint64_t numElems, size_t extraBytes = 0) { + void pushed_back(size_t numElems, size_t extraBytes = 0) { _usedElems += numElems; _extraUsedBytes += extraBytes; } - void cleanHold(void *buffer, uint64_t offset, uint64_t len) { - _typeHandler->cleanHold(buffer, offset, len, BufferTypeBase::CleanContext(_extraHoldBytes)); + void cleanHold(void *buffer, size_t offset, size_t numElems) { + _typeHandler->cleanHold(buffer, offset, numElems, BufferTypeBase::CleanContext(_extraHoldBytes)); } void dropBuffer(void *&buffer); uint32_t getTypeId() const { return _typeId; } uint32_t getArraySize() const { return _arraySize; } - uint64_t getDeadElems() const { return _deadElems; } - uint64_t getHoldElems() const { return _holdElems; } + size_t getDeadElems() const { return _deadElems; } + size_t getHoldElems() const { return _holdElems; } size_t getExtraUsedBytes() const { return _extraUsedBytes; } size_t getExtraHoldBytes() const { return _extraHoldBytes; } bool getCompacting() const { return _compacting; } void setCompacting() { _compacting = true; } - void fallbackResize(uint32_t bufferId, uint64_t elementsNeeded, void *&buffer, Alloc &holdBuffer); + void fallbackResize(uint32_t bufferId, size_t elementsNeeded, void *&buffer, Alloc &holdBuffer); bool isActive(uint32_t typeId) const { return ((_state == ACTIVE) && (_typeId == typeId)); @@ -170,9 +170,9 @@ public: const BufferTypeBase *getTypeHandler() const { return _typeHandler; } BufferTypeBase *getTypeHandler() { return _typeHandler; } - void incDeadElems(uint64_t value) { _deadElems += value; } - void incHoldElems(uint64_t value) { _holdElems += value; } - void decHoldElems(uint64_t value) { + void incDeadElems(size_t value) { _deadElems += value; } + void incHoldElems(size_t value) { _holdElems += value; } + void decHoldElems(size_t value) { assert(_holdElems >= value); _holdElems -= value; } diff --git a/searchlib/src/vespa/searchlib/datastore/datastore.h b/searchlib/src/vespa/searchlib/datastore/datastore.h index c0fccdfb776..66fbc37d4fc 100644 --- a/searchlib/src/vespa/searchlib/datastore/datastore.h +++ b/searchlib/src/vespa/searchlib/datastore/datastore.h @@ -42,7 +42,7 @@ public: * @param ref Reference to dead stored features * @param dead Number of newly dead elements */ - void incDead(EntryRef ref, uint64_t deadElems) { + void incDead(EntryRef ref, size_t deadElems) { RefType intRef(ref); DataStoreBase::incDead(intRef.bufferId(), deadElems); } @@ -50,12 +50,12 @@ public: /** * Free element(s). */ - void freeElem(EntryRef ref, uint64_t numElems); + void freeElem(EntryRef ref, size_t numElems); /** * Hold element(s). */ - void holdElem(EntryRef ref, uint64_t numElems, size_t extraBytes = 0); + void holdElem(EntryRef ref, size_t numElems, size_t extraBytes = 0); /** * Trim elem hold list, freeing elements that no longer needs to be held. diff --git a/searchlib/src/vespa/searchlib/datastore/datastore.hpp b/searchlib/src/vespa/searchlib/datastore/datastore.hpp index aa242d5b968..ff6c249627b 100644 --- a/searchlib/src/vespa/searchlib/datastore/datastore.hpp +++ b/searchlib/src/vespa/searchlib/datastore/datastore.hpp @@ -25,7 +25,7 @@ DataStoreT<RefT>::~DataStoreT() template <typename RefT> void -DataStoreT<RefT>::freeElem(EntryRef ref, uint64_t numElems) +DataStoreT<RefT>::freeElem(EntryRef ref, size_t numElems) { RefType intRef(ref); BufferState &state = getBufferState(intRef.bufferId()); @@ -47,10 +47,10 @@ DataStoreT<RefT>::freeElem(EntryRef ref, uint64_t numElems) template <typename RefT> void -DataStoreT<RefT>::holdElem(EntryRef ref, uint64_t numElems, size_t extraBytes) +DataStoreT<RefT>::holdElem(EntryRef ref, size_t numElems, size_t extraBytes) { RefType intRef(ref); - uint64_t alignedLen = RefType::align(numElems); + size_t alignedLen = RefType::align(numElems); BufferState &state = getBufferState(intRef.bufferId()); assert(state.isActive()); if (state.hasDisabledElemHoldList()) { diff --git a/searchlib/src/vespa/searchlib/datastore/datastorebase.cpp b/searchlib/src/vespa/searchlib/datastore/datastorebase.cpp index c922c337a18..4b4a20ecc4a 100644 --- a/searchlib/src/vespa/searchlib/datastore/datastorebase.cpp +++ b/searchlib/src/vespa/searchlib/datastore/datastorebase.cpp @@ -381,7 +381,7 @@ DataStoreBase::finishCompact(const std::vector<uint32_t> &toHold) } void -DataStoreBase::fallbackResize(uint32_t bufferId, uint64_t elemsNeeded) +DataStoreBase::fallbackResize(uint32_t bufferId, size_t elemsNeeded) { BufferState &state = getBufferState(bufferId); BufferState::Alloc toHoldBuffer; diff --git a/searchlib/src/vespa/searchlib/datastore/datastorebase.h b/searchlib/src/vespa/searchlib/datastore/datastorebase.h index d6171dc1c0c..4f86594dd58 100644 --- a/searchlib/src/vespa/searchlib/datastore/datastorebase.h +++ b/searchlib/src/vespa/searchlib/datastore/datastorebase.h @@ -24,9 +24,9 @@ public: { public: EntryRef _ref; - uint64_t _len; // Aligned length + size_t _len; // Aligned length - ElemHold1ListElem(EntryRef ref, uint64_t len) + ElemHold1ListElem(EntryRef ref, size_t len) : _ref(ref), _len(len) { } @@ -90,14 +90,14 @@ public: class MemStats { public: - uint64_t _allocElems; - uint64_t _usedElems; - uint64_t _deadElems; - uint64_t _holdElems; - uint64_t _allocBytes; - uint64_t _usedBytes; - uint64_t _deadBytes; - uint64_t _holdBytes; + size_t _allocElems; + size_t _usedElems; + size_t _deadElems; + size_t _holdElems; + size_t _allocBytes; + size_t _usedBytes; + size_t _deadBytes; + size_t _holdBytes; uint32_t _freeBuffers; uint32_t _activeBuffers; uint32_t _holdBuffers; @@ -266,19 +266,19 @@ public: void clearHoldLists(); template <typename EntryType> - EntryType *getBufferEntry(uint32_t bufferId, uint64_t offset) { + EntryType *getBufferEntry(uint32_t bufferId, size_t offset) { return static_cast<EntryType *>(_buffers[bufferId].getBuffer()) + offset; } template <typename EntryType> - const EntryType *getBufferEntry(uint32_t bufferId, uint64_t offset) const { + const EntryType *getBufferEntry(uint32_t bufferId, size_t offset) const { return static_cast<const EntryType *>(_buffers[bufferId].getBuffer()) + offset; } void dropBuffers(); - void incDead(uint32_t bufferId, uint64_t deadElems) { + void incDead(uint32_t bufferId, size_t deadElems) { BufferState &state = _states[bufferId]; state.incDeadElems(deadElems); } @@ -337,7 +337,7 @@ public: std::vector<uint32_t> startCompact(uint32_t typeId); void finishCompact(const std::vector<uint32_t> &toHold); - void fallbackResize(uint32_t bufferId, uint64_t elementsNeeded); + void fallbackResize(uint32_t bufferId, size_t elementsNeeded); vespalib::GenerationHolder &getGenerationHolder() { return _genHolder; diff --git a/searchlib/src/vespa/searchlib/datastore/entryref.cpp b/searchlib/src/vespa/searchlib/datastore/entryref.cpp index f7224191d1b..649bfa7e4e9 100644 --- a/searchlib/src/vespa/searchlib/datastore/entryref.cpp +++ b/searchlib/src/vespa/searchlib/datastore/entryref.cpp @@ -4,14 +4,14 @@ namespace search::datastore { -template EntryRefT<24u, 8u>::EntryRefT(uint64_t, uint32_t); -template EntryRefT<31u, 1u>::EntryRefT(uint64_t, uint32_t); -template EntryRefT<22u,10u>::EntryRefT(uint64_t, uint32_t); -template EntryRefT<19u,13u>::EntryRefT(uint64_t, uint32_t); -template EntryRefT<18u, 6u>::EntryRefT(uint64_t, uint32_t); -template EntryRefT<15u,17u>::EntryRefT(uint64_t, uint32_t); -template EntryRefT<10u,22u>::EntryRefT(uint64_t, uint32_t); -template EntryRefT<10u,10u>::EntryRefT(uint64_t, uint32_t); -template EntryRefT< 3u, 2u>::EntryRefT(uint64_t, uint32_t); +template EntryRefT<24u, 8u>::EntryRefT(size_t, uint32_t); +template EntryRefT<31u, 1u>::EntryRefT(size_t, uint32_t); +template EntryRefT<22u,10u>::EntryRefT(size_t, uint32_t); +template EntryRefT<19u,13u>::EntryRefT(size_t, uint32_t); +template EntryRefT<18u, 6u>::EntryRefT(size_t, uint32_t); +template EntryRefT<15u,17u>::EntryRefT(size_t, uint32_t); +template EntryRefT<10u,22u>::EntryRefT(size_t, uint32_t); +template EntryRefT<10u,10u>::EntryRefT(size_t, uint32_t); +template EntryRefT< 3u, 2u>::EntryRefT(size_t, uint32_t); } diff --git a/searchlib/src/vespa/searchlib/datastore/entryref.h b/searchlib/src/vespa/searchlib/datastore/entryref.h index 918e514c8df..a582d2020f9 100644 --- a/searchlib/src/vespa/searchlib/datastore/entryref.h +++ b/searchlib/src/vespa/searchlib/datastore/entryref.h @@ -2,6 +2,7 @@ #pragma once +#include <cstddef> #include <cstdint> namespace search::datastore { @@ -27,15 +28,15 @@ template <uint32_t OffsetBits, uint32_t BufferBits = 32u - OffsetBits> class EntryRefT : public EntryRef { public: EntryRefT() : EntryRef() {} - EntryRefT(uint64_t offset_, uint32_t bufferId_); + EntryRefT(size_t offset_, uint32_t bufferId_); EntryRefT(const EntryRef & ref_) : EntryRef(ref_.ref()) {} uint32_t hash() const { return offset() + (bufferId() << OffsetBits); } - uint64_t offset() const { return _ref >> BufferBits; } + size_t offset() const { return _ref >> BufferBits; } uint32_t bufferId() const { return _ref & (numBuffers() - 1); } - static uint64_t offsetSize() { return 1ul << OffsetBits; } + static size_t offsetSize() { return 1ul << OffsetBits; } static uint32_t numBuffers() { return 1 << BufferBits; } - static uint64_t align(uint64_t val) { return val; } - static uint64_t pad(uint64_t val) { (void) val; return 0ul; } + static size_t align(size_t val) { return val; } + static size_t pad(size_t val) { (void) val; return 0ul; } static constexpr bool isAlignedType = false; }; @@ -50,13 +51,13 @@ private: static const uint32_t PadConstant = ((1 << OffsetAlign) - 1); public: AlignedEntryRefT() : ParentType() {} - AlignedEntryRefT(uint64_t offset_, uint32_t bufferId_) : + AlignedEntryRefT(size_t offset_, uint32_t bufferId_) : ParentType(align(offset_) >> OffsetAlign, bufferId_) {} AlignedEntryRefT(const EntryRef & ref_) : ParentType(ref_) {} - uint64_t offset() const { return ParentType::offset() << OffsetAlign; } - static uint64_t offsetSize() { return ParentType::offsetSize() << OffsetAlign; } - static uint64_t align(uint64_t val) { return val + pad(val); } - static uint64_t pad(uint64_t val) { return (-val & PadConstant); } + size_t offset() const { return ParentType::offset() << OffsetAlign; } + static size_t offsetSize() { return ParentType::offsetSize() << OffsetAlign; } + static size_t align(size_t val) { return val + pad(val); } + static size_t pad(size_t val) { return (-val & PadConstant); } static constexpr bool isAlignedType = true; }; diff --git a/searchlib/src/vespa/searchlib/datastore/entryref.hpp b/searchlib/src/vespa/searchlib/datastore/entryref.hpp index a7bb9f9b3ef..6e8b94f8989 100644 --- a/searchlib/src/vespa/searchlib/datastore/entryref.hpp +++ b/searchlib/src/vespa/searchlib/datastore/entryref.hpp @@ -8,7 +8,7 @@ namespace search::datastore { template <uint32_t OffsetBits, uint32_t BufferBits> -EntryRefT<OffsetBits, BufferBits>::EntryRefT(uint64_t offset_, uint32_t bufferId_) : +EntryRefT<OffsetBits, BufferBits>::EntryRefT(size_t offset_, uint32_t bufferId_) : EntryRef((offset_ << BufferBits) + bufferId_) { ASSERT_ONCE_OR_LOG(offset_ < offsetSize(), "EntryRefT.offset_overflow", 10000); diff --git a/searchlib/src/vespa/searchlib/datastore/free_list_raw_allocator.hpp b/searchlib/src/vespa/searchlib/datastore/free_list_raw_allocator.hpp index 583bd865f23..dbb54247f58 100644 --- a/searchlib/src/vespa/searchlib/datastore/free_list_raw_allocator.hpp +++ b/searchlib/src/vespa/searchlib/datastore/free_list_raw_allocator.hpp @@ -25,7 +25,7 @@ FreeListRawAllocator<EntryT, RefT>::alloc(size_t numElems) assert(state.getArraySize() == numElems); RefT ref = state.popFreeList(); // If entry ref is not aligned we must scale the offset according to array size as it was divided when the entry ref was created. - uint64_t offset = !RefT::isAlignedType ? ref.offset() * state.getArraySize() : ref.offset(); + size_t offset = !RefT::isAlignedType ? ref.offset() * state.getArraySize() : ref.offset(); EntryT *entry = _store.template getBufferEntry<EntryT>(ref.bufferId(), offset); return HandleType(ref, entry); } diff --git a/searchlib/src/vespa/searchlib/features/queryfeature.cpp b/searchlib/src/vespa/searchlib/features/queryfeature.cpp index 3e52546e841..c5488581d29 100644 --- a/searchlib/src/vespa/searchlib/features/queryfeature.cpp +++ b/searchlib/src/vespa/searchlib/features/queryfeature.cpp @@ -4,22 +4,24 @@ #include "utils.h" #include "valuefeature.h" +#include <vespa/document/datatype/tensor_data_type.h> #include <vespa/searchlib/features/constant_tensor_executor.h> #include <vespa/searchlib/fef/featureexecutor.h> #include <vespa/searchlib/fef/indexproperties.h> #include <vespa/searchlib/fef/properties.h> #include <vespa/searchlib/fef/feature_type.h> #include <vespa/vespalib/objects/nbostream.h> -#include <vespa/eval/tensor/default_tensor.h> -#include <vespa/eval/tensor/tensor_mapper.h> #include <vespa/eval/tensor/serialization/typed_binary_format.h> +#include <vespa/eval/tensor/tensor.h> #include <vespa/eval/eval/value_type.h> #include <vespa/vespalib/locale/c.h> +#include <vespa/log/log.h> +LOG_SETUP(".features.queryfeature"); + using namespace search::fef; using namespace search::fef::indexproperties; -using vespalib::tensor::DefaultTensor; -using vespalib::tensor::TensorBuilder; +using document::TensorDataType; using vespalib::eval::ValueType; using search::fef::FeatureType; @@ -121,11 +123,11 @@ createTensorExecutor(const search::fef::IQueryEnvironment &env, if (prop.found() && !prop.get().empty()) { const vespalib::string &value = prop.get(); vespalib::nbostream stream(value.data(), value.size()); - vespalib::tensor::Tensor::UP tensor = vespalib::tensor::TypedBinaryFormat::deserialize(stream); - if (tensor->type() != valueType) { - vespalib::tensor::TensorMapper mapper(valueType); - vespalib::tensor::Tensor::UP mappedTensor = mapper.map(*tensor); - tensor = std::move(mappedTensor); + auto tensor = vespalib::tensor::TypedBinaryFormat::deserialize(stream); + if (!TensorDataType::isAssignableType(valueType, tensor->type())) { + LOG(warning, "Query feature type is '%s' but other tensor type is '%s'", + valueType.to_spec().c_str(), tensor->type().to_spec().c_str()); + return ConstantTensorExecutor::createEmpty(valueType, stash); } return ConstantTensorExecutor::create(std::move(tensor), stash); } diff --git a/searchlib/src/vespa/searchlib/tensor/dense_tensor_store.cpp b/searchlib/src/vespa/searchlib/tensor/dense_tensor_store.cpp index 31defbfe4d9..094df667146 100644 --- a/searchlib/src/vespa/searchlib/tensor/dense_tensor_store.cpp +++ b/searchlib/src/vespa/searchlib/tensor/dense_tensor_store.cpp @@ -54,11 +54,11 @@ DenseTensorStore::BufferType::BufferType(const TensorSizeCalc &tensorSizeCalc) DenseTensorStore::BufferType::~BufferType() = default; void -DenseTensorStore::BufferType::cleanHold(void *buffer, uint64_t offset, - uint64_t len, CleanContext) +DenseTensorStore::BufferType::cleanHold(void *buffer, size_t offset, + size_t numElems, CleanContext) { // Clear both tensor dimension size information and cells. - memset(static_cast<char *>(buffer) + offset - _unboundDimSizesSize, 0, len); + memset(static_cast<char *>(buffer) + offset - _unboundDimSizesSize, 0, numElems); } size_t diff --git a/searchlib/src/vespa/searchlib/tensor/dense_tensor_store.h b/searchlib/src/vespa/searchlib/tensor/dense_tensor_store.h index 4008b635d85..6b87bb76b87 100644 --- a/searchlib/src/vespa/searchlib/tensor/dense_tensor_store.h +++ b/searchlib/src/vespa/searchlib/tensor/dense_tensor_store.h @@ -47,7 +47,7 @@ public: public: BufferType(const TensorSizeCalc &tensorSizeCalc); ~BufferType() override; - void cleanHold(void *buffer, uint64_t offset, uint64_t len, CleanContext cleanCtx) override; + void cleanHold(void *buffer, size_t offset, size_t numElems, CleanContext cleanCtx) override; uint32_t unboundDimSizesSize() const { return _unboundDimSizesSize; } size_t getReservedElements(uint32_t bufferId) const override; static size_t align(size_t size, size_t alignment) { |