aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2023-12-14 16:43:50 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2023-12-15 15:56:38 +0000
commitcd4ccd9fe96daf59412af0e98c4b359933d17b1b (patch)
tree0217c406b3cec8c6b00c998c830a191c59e9ab48
parent28f8cf3e298d51ca703ceee36a992297d38637cc (diff)
- Separate hot/cold path to enable compiler to make an even leaner hot path.
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.cpp26
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.h8
2 files changed, 20 insertions, 14 deletions
diff --git a/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.cpp b/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.cpp
index fdf4ec950dd..331f01d4a82 100644
--- a/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.cpp
@@ -63,24 +63,24 @@ MultiBitVector<Update>::MultiBitVector(size_t reserved)
template<typename Update>
bool
-MultiBitVector<Update>::updateLastValue(uint32_t docId) noexcept
+MultiBitVector<Update>::updateLastValueCold(uint32_t docId) noexcept
{
- if (docId >= _lastMaxDocIdLimit) {
- if (__builtin_expect(isAtEnd(docId), false)) {
- return true;
- }
- const uint32_t index(BitWord::wordNum(docId));
- if (docId >= _lastMaxDocIdLimitRequireFetch) {
- uint32_t baseIndex = index & ~(NumWordsInBatch - 1);
- _update(_accel, baseIndex*sizeof(Word), _bvs, _lastWords);
- _lastMaxDocIdLimitRequireFetch = (baseIndex + NumWordsInBatch) * BitWord::WordLen;
- }
- _lastValue = _lastWords[index % NumWordsInBatch];
- _lastMaxDocIdLimit = (index + 1) * BitWord::WordLen;
+ if (__builtin_expect(isAtEnd(docId), false)) {
+ return true;
}
+ const uint32_t index(BitWord::wordNum(docId));
+ if (docId >= _lastMaxDocIdLimitRequireFetch) {
+ uint32_t baseIndex = index & ~(NumWordsInBatch - 1);
+ _update(_accel, baseIndex*sizeof(Word), _bvs, _lastWords);
+ _lastMaxDocIdLimitRequireFetch = (baseIndex + NumWordsInBatch) * BitWord::WordLen;
+ }
+ _lastValue = _lastWords[index % NumWordsInBatch];
+ _lastMaxDocIdLimit = (index + 1) * BitWord::WordLen;
return false;
}
+
+
template<typename Update>
uint32_t
MultiBitVector<Update>::strictSeek(uint32_t docId) noexcept
diff --git a/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.h b/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.h
index 2b4f90544ac..66598e28e3e 100644
--- a/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.h
+++ b/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.h
@@ -37,7 +37,13 @@ public:
bool seek(uint32_t docId) noexcept;
bool acceptExtraFilter() const noexcept { return Update::isAnd(); }
private:
- bool updateLastValue(uint32_t docId) noexcept;
+ bool updateLastValue(uint32_t docId) noexcept {
+ if (docId >= _lastMaxDocIdLimit) {
+ return updateLastValueCold(docId);
+ }
+ return false;
+ }
+ VESPA_DLL_LOCAL bool updateLastValueCold(uint32_t docId) noexcept __attribute__((noinline));
using IAccelrated = vespalib::hwaccelrated::IAccelrated;
Update _update;