diff options
8 files changed, 22 insertions, 14 deletions
diff --git a/eval/src/tests/ann/nns-l2.h b/eval/src/tests/ann/nns-l2.h index 857866ff73b..cd8b2569438 100644 --- a/eval/src/tests/ann/nns-l2.h +++ b/eval/src/tests/ann/nns-l2.h @@ -36,7 +36,7 @@ template <typename FltType = float> struct L2DistCalc { vespalib::hwaccelrated::IAccelrated::UP _hw; - L2DistCalc() : _hw(vespalib::hwaccelrated::IAccelrated::getAccelrator()) {} + L2DistCalc() : _hw(vespalib::hwaccelrated::IAccelrated::createAccelrator()) {} using Arr = vespalib::ArrayRef<FltType>; using ConstArr = vespalib::ConstArrayRef<FltType>; diff --git a/searchlib/src/vespa/searchlib/common/bitvector.cpp b/searchlib/src/vespa/searchlib/common/bitvector.cpp index e28ebe6682f..2e70e9f2603 100644 --- a/searchlib/src/vespa/searchlib/common/bitvector.cpp +++ b/searchlib/src/vespa/searchlib/common/bitvector.cpp @@ -165,7 +165,7 @@ BitVector::countInterval(Index start, Index end) const ++endw; } if (startw < endw) { - res += IAccelrated::getAccelrator()->populationCount(bitValues + startw, endw - startw); + res += IAccelrated::getAccelrator().populationCount(bitValues + startw, endw - startw); } if (partialEnd) { res += Optimized::popCount(bitValues[endw] & ~endBits(last)); @@ -178,7 +178,7 @@ void BitVector::orWith(const BitVector & right) { verifyContains(*this, right); - IAccelrated::getAccelrator()->orBit(getActiveStart(), right.getWordIndex(getStartIndex()), getActiveBytes()); + IAccelrated::getAccelrator().orBit(getActiveStart(), right.getWordIndex(getStartIndex()), getActiveBytes()); repairEnds(); invalidateCachedCount(); @@ -201,7 +201,7 @@ BitVector::andWith(const BitVector & right) { verifyContains(*this, right); - IAccelrated::getAccelrator()->andBit(getActiveStart(), right.getWordIndex(getStartIndex()), getActiveBytes()); + IAccelrated::getAccelrator().andBit(getActiveStart(), right.getWordIndex(getStartIndex()), getActiveBytes()); setGuardBit(); invalidateCachedCount(); @@ -213,7 +213,7 @@ BitVector::andNotWith(const BitVector& right) { verifyContains(*this, right); - IAccelrated::getAccelrator()->andNotBit(getActiveStart(), right.getWordIndex(getStartIndex()), getActiveBytes()); + IAccelrated::getAccelrator().andNotBit(getActiveStart(), right.getWordIndex(getStartIndex()), getActiveBytes()); setGuardBit(); invalidateCachedCount(); @@ -221,7 +221,7 @@ BitVector::andNotWith(const BitVector& right) void BitVector::notSelf() { - IAccelrated::getAccelrator()->notBit(getActiveStart(), getActiveBytes()); + IAccelrated::getAccelrator().notBit(getActiveStart(), getActiveBytes()); setGuardBit(); invalidateCachedCount(); } diff --git a/searchlib/src/vespa/searchlib/features/dotproductfeature.cpp b/searchlib/src/vespa/searchlib/features/dotproductfeature.cpp index 811a318682b..ec31bcb5117 100644 --- a/searchlib/src/vespa/searchlib/features/dotproductfeature.cpp +++ b/searchlib/src/vespa/searchlib/features/dotproductfeature.cpp @@ -268,7 +268,7 @@ void DotProductExecutorBase<BaseType>::execute(uint32_t docId) { size_t count = getAttributeValues(docId, values); size_t commonRange = std::min(count, _queryVector.size()); static_assert(std::is_same<typename AT::ValueType, BaseType>::value); - outputs().set_number(0, _multiplier->dotProduct( + outputs().set_number(0, _multiplier.dotProduct( &_queryVector[0], reinterpret_cast<const typename AT::ValueType *>(values), commonRange)); } diff --git a/searchlib/src/vespa/searchlib/features/dotproductfeature.h b/searchlib/src/vespa/searchlib/features/dotproductfeature.h index a13fc6794fc..bca6983877c 100644 --- a/searchlib/src/vespa/searchlib/features/dotproductfeature.h +++ b/searchlib/src/vespa/searchlib/features/dotproductfeature.h @@ -181,8 +181,8 @@ public: using AT = multivalue::Value<BaseType>; using V = std::vector<BaseType>; private: - vespalib::hwaccelrated::IAccelrated::UP _multiplier; - V _queryVector; + const vespalib::hwaccelrated::IAccelrated & _multiplier; + V _queryVector; virtual size_t getAttributeValues(uint32_t docid, const AT * & count) = 0; public: DotProductExecutorBase(const V & queryVector); diff --git a/searchlib/src/vespa/searchlib/tensor/distance_functions.h b/searchlib/src/vespa/searchlib/tensor/distance_functions.h index 09f538269d8..3ed27be88b9 100644 --- a/searchlib/src/vespa/searchlib/tensor/distance_functions.h +++ b/searchlib/src/vespa/searchlib/tensor/distance_functions.h @@ -16,7 +16,7 @@ template <typename FloatType> class SquaredEuclideanDistance : public DistanceFunction { public: SquaredEuclideanDistance() - : _computer(vespalib::hwaccelrated::IAccelrated::getAccelrator()) + : _computer(vespalib::hwaccelrated::IAccelrated::createAccelrator()) {} double calc(const vespalib::tensor::TypedCells& lhs, const vespalib::tensor::TypedCells& rhs) const override { auto lhs_vector = lhs.typify<FloatType>(); diff --git a/vespalib/src/tests/dotproduct/dotproductbenchmark.cpp b/vespalib/src/tests/dotproduct/dotproductbenchmark.cpp index 3588e0ce239..5b75fb46a41 100644 --- a/vespalib/src/tests/dotproduct/dotproductbenchmark.cpp +++ b/vespalib/src/tests/dotproduct/dotproductbenchmark.cpp @@ -60,7 +60,7 @@ template <typename T> FullBenchmark<T>::FullBenchmark(size_t numDocs, size_t numValues) : _values(numDocs*numValues), _query(numValues), - _dp(IAccelrated::getAccelrator()) + _dp(IAccelrated::createAccelrator()) { for (size_t i(0); i < numDocs; i++) { for (size_t j(0); j < numValues; j++) { diff --git a/vespalib/src/vespa/vespalib/hwaccelrated/iaccelrated.cpp b/vespalib/src/vespa/vespalib/hwaccelrated/iaccelrated.cpp index ffa994641e9..9d5256d79b2 100644 --- a/vespalib/src/vespa/vespalib/hwaccelrated/iaccelrated.cpp +++ b/vespalib/src/vespa/vespalib/hwaccelrated/iaccelrated.cpp @@ -122,7 +122,7 @@ RuntimeVerificator::RuntimeVerificator() GenericAccelrator generic; verify(generic); - IAccelrated::UP thisCpu(IAccelrated::getAccelrator()); + IAccelrated::UP thisCpu(IAccelrated::createAccelrator()); verify(*thisCpu); } @@ -156,9 +156,16 @@ RuntimeVerificator _G_verifyAccelrator; IAccelrated::UP -IAccelrated::getAccelrator() +IAccelrated::createAccelrator() { return _G_selector.create(); } +const IAccelrated & +IAccelrated::getAccelrator() +{ + static IAccelrated::UP accelrator = _G_selector.create(); + return *accelrator; +} + } diff --git a/vespalib/src/vespa/vespalib/hwaccelrated/iaccelrated.h b/vespalib/src/vespa/vespalib/hwaccelrated/iaccelrated.h index ea7e268bc6f..0647aca784f 100644 --- a/vespalib/src/vespa/vespalib/hwaccelrated/iaccelrated.h +++ b/vespalib/src/vespa/vespalib/hwaccelrated/iaccelrated.h @@ -30,7 +30,8 @@ public: virtual double squaredEuclideanDistance(const float * a, const float * b, size_t sz) const = 0; virtual double squaredEuclideanDistance(const double * a, const double * b, size_t sz) const = 0; - static IAccelrated::UP getAccelrator() __attribute__((noinline)); + static IAccelrated::UP createAccelrator() __attribute__((noinline)); + static const IAccelrated & getAccelrator() __attribute__((noinline)); }; } |