命名空间 faiss::simd_result_handlers

namespace simd_result_handlers

函数

template<class C, bool W, class Consumer, class ...Types>
void dispatch_SIMDResultHandler_fixedCW(SIMDResultHandler &res, Consumer &consumer, Types... args)
template<class C, class Consumer, class ...Types>
void dispatch_SIMDResultHandler_fixedC(SIMDResultHandler &res, Consumer &consumer, Types... args)
template<class Consumer, class ...Types>
void dispatch_SIMDResultHandler(SIMDResultHandler &res, Consumer &consumer, Types... args)
struct DummyResultHandler : public faiss::SIMDResultHandler
#include <simd_result_handlers.h>

只是在结果上计算校验和的虚拟结构(以避免计算被优化掉)

公共函数

inline virtual void handle(size_t q, size_t b, simd16uint16 d0, simd16uint16 d1) final

当计算 32 个距离并以两个 simd16uint16 提供时调用。(q,b)指示它是块中的哪个条目。

inline virtual void set_block_origin(size_t, size_t) final

设置正在计算的子矩阵

inline ~DummyResultHandler()

公共成员

size_t cs = 0
bool is_CMax = false
uint8_t sizeof_ids = 0
bool with_fields = false
struct StoreResultHandler : public faiss::SIMDResultHandler
#include <simd_result_handlers.h>

将结果存储在一个 nq-by-nb 的矩阵中。

j0 是矩阵当前左上角的块。

公共函数

inline StoreResultHandler(uint16_t *data, size_t ld)
inline virtual void handle(size_t q, size_t b, simd16uint16 d0, simd16uint16 d1) final

当计算 32 个距离并以两个 simd16uint16 提供时调用。(q,b)指示它是块中的哪个条目。

inline virtual void set_block_origin(size_t i0_in, size_t j0_in) final

设置正在计算的子矩阵

公共成员

uint16_t *data
size_t ld
size_t i0 = 0
size_t j0 = 0
bool is_CMax = false
uint8_t sizeof_ids = 0
bool with_fields = false
template<int NQ, int BB>
struct FixedStorageHandler : public faiss::SIMDResultHandler
#include <simd_result_handlers.h>

将结果存储在固定大小的矩阵中。

公共函数

inline virtual void handle(size_t q, size_t b, simd16uint16 d0, simd16uint16 d1) final

当计算 32 个距离并以两个 simd16uint16 提供时调用。(q,b)指示它是块中的哪个条目。

inline virtual void set_block_origin(size_t i0_in, size_t j0_in) final

设置正在计算的子矩阵

template<class OtherResultHandler>
inline void to_other_handler(OtherResultHandler &other) const
inline virtual ~FixedStorageHandler()

公共成员

simd16uint16 dis[NQ][BB]
int i0 = 0
bool is_CMax = false
uint8_t sizeof_ids = 0
bool with_fields = false
template<class C, bool with_id_map>
struct ResultHandlerCompare : public faiss::SIMDResultHandlerToFloat
#include <simd_result_handlers.h>

Result handler that compares distances to check if they need to be kept

Subclassed by faiss::simd_result_handlers::RangeHandler< C, false >

Public Types

using TI = typename C::TI

公共函数

inline ResultHandlerCompare(size_t nq, size_t ntotal, const IDSelector *sel_in)
inline virtual void set_block_origin(size_t i0_in, size_t j0_in) final

设置正在计算的子矩阵

inline void adjust_with_origin(size_t &q, simd16uint16 &d0, simd16uint16 &d1)
inline int64_t adjust_id(size_t b, size_t j)
inline uint32_t get_lt_mask(uint16_t thr, size_t b, simd16uint16 d0, simd16uint16 d1)

return binary mask of elements below thr in (d0, d1) inverse_test returns elements above

inline virtual ~ResultHandlerCompare()
inline virtual void begin(const float *norms)
inline virtual void end()
virtual void handle(size_t q, size_t b, simd16uint16 d0, simd16uint16 d1) = 0

当计算 32 个距离并以两个 simd16uint16 提供时调用。(q,b)指示它是块中的哪个条目。

公共成员

bool disable = false
int64_t i0 = 0
int64_t j0 = 0
const IDSelector *sel
size_t nq
size_t ntotal
const idx_t *id_map = nullptr

这些字段主要用于 IVF 变体(with_id_map=true)

const int *q_map = nullptr
const uint16_t *dbias = nullptr
const float *normalizers = nullptr
bool is_CMax = false
uint8_t sizeof_ids = 0
bool with_fields = false
template<class C, bool with_id_map = false>
struct SingleResultHandler : public faiss::simd_result_handlers::ResultHandlerCompare<C, false>
#include <simd_result_handlers.h>

k=1 的特殊版本

Public Types

using T = typename C::T
using TI = typename C::TI
using RHC = ResultHandlerCompare<C, with_id_map>

公共函数

inline SingleResultHandler(size_t nq, size_t ntotal, float *dis, int64_t *ids, const IDSelector *sel_in)
inline virtual void handle(size_t q, size_t b, simd16uint16 d0, simd16uint16 d1) final

当计算 32 个距离并以两个 simd16uint16 提供时调用。(q,b)指示它是块中的哪个条目。

inline virtual void end()
inline virtual void set_block_origin(size_t i0_in, size_t j0_in) final

设置正在计算的子矩阵

inline void adjust_with_origin(size_t &q, simd16uint16 &d0, simd16uint16 &d1)
inline int64_t adjust_id(size_t b, size_t j)
inline uint32_t get_lt_mask(uint16_t thr, size_t b, simd16uint16 d0, simd16uint16 d1)

return binary mask of elements below thr in (d0, d1) inverse_test returns elements above

inline virtual void begin(const float *norms)

公共成员

std::vector<int16_t> idis
float *dis
int64_t *ids
bool disable
int64_t i0
int64_t j0
const IDSelector *sel
size_t nq
size_t ntotal
const idx_t *id_map = nullptr

这些字段主要用于 IVF 变体(with_id_map=true)

const int *q_map = nullptr
const uint16_t *dbias = nullptr
const float *normalizers = nullptr
bool is_CMax = false
uint8_t sizeof_ids = 0
bool with_fields = false
template<class C, bool with_id_map = false>
struct HeapHandler : public faiss::simd_result_handlers::ResultHandlerCompare<C, false>
#include <simd_result_handlers.h>

在最小堆或最大堆中收集结果的结构体

Public Types

using T = typename C::T
using TI = typename C::TI
using RHC = ResultHandlerCompare<C, with_id_map>

公共函数

inline HeapHandler(size_t nq, size_t ntotal, int64_t k, float *dis, int64_t *ids, const IDSelector *sel_in)
inline virtual void handle(size_t q, size_t b, simd16uint16 d0, simd16uint16 d1) final

当计算 32 个距离并以两个 simd16uint16 提供时调用。(q,b)指示它是块中的哪个条目。

inline virtual void end() override
inline virtual void set_block_origin(size_t i0_in, size_t j0_in) final

设置正在计算的子矩阵

inline void adjust_with_origin(size_t &q, simd16uint16 &d0, simd16uint16 &d1)
inline int64_t adjust_id(size_t b, size_t j)
inline uint32_t get_lt_mask(uint16_t thr, size_t b, simd16uint16 d0, simd16uint16 d1)

return binary mask of elements below thr in (d0, d1) inverse_test returns elements above

inline virtual void begin(const float *norms)

公共成员

std::vector<uint16_t> idis
std::vector<TI> iids
float *dis
int64_t *ids
int64_t k
bool disable
int64_t i0
int64_t j0
const IDSelector *sel
size_t nq
size_t ntotal
const idx_t *id_map = nullptr

这些字段主要用于 IVF 变体(with_id_map=true)

const int *q_map = nullptr
const uint16_t *dbias = nullptr
const float *normalizers = nullptr
bool is_CMax = false
uint8_t sizeof_ids = 0
bool with_fields = false
template<class C, bool with_id_map = false>
struct ReservoirHandler : public faiss::simd_result_handlers::ResultHandlerCompare<C, false>
#include <simd_result_handlers.h>

使用水库的简单 top-N 实现。

结果存储在低于阈值时,直到达到容量。然后,使用分区排序来更新阈值。处理程序由几个 ReservoirTopN(每个查询一个)构建

Public Types

using T = typename C::T
using TI = typename C::TI
using RHC = ResultHandlerCompare<C, with_id_map>

公共函数

inline ReservoirHandler(size_t nq, size_t ntotal, size_t k, size_t cap, float *dis, int64_t *ids, const IDSelector *sel_in)
inline virtual void handle(size_t q, size_t b, simd16uint16 d0, simd16uint16 d1) final

当计算 32 个距离并以两个 simd16uint16 提供时调用。(q,b)指示它是块中的哪个条目。


, )

设置正在计算的子矩阵

, , simd16uint16 , simd16uint16)
int64_t , )
uint32_t , , simd16uint16 , simd16uint16)

return binary mask of elements below thr in (d0, d1) inverse_test returns elements above


公共成员


*dis
int64_t *ids
std::vector all_ids
AlignedTable all_vals
std::vector> reservoirs
bool disable
int64_t i0
int64_t j0
IDSelector *sel
size_t nq
size_t ntotal
const idx_t *id_map = nullptr

这些字段主要用于 IVF 变体(with_id_map=true)

const int *q_map = nullptr
const uint16_t *dbias = nullptr
const float *normalizers = nullptr
bool is_CMax = false
uint8_t sizeof_ids = 0
bool with_fields = false
template<class C, bool with_id_map = false>
struct RangeHandler : public faiss::simd_result_handlers::ResultHandlerCompare<C, false>
#include <simd_result_handlers.h>

用于范围搜索的结果处理程序。 难点在于范围距离必须使用缩放器进行缩放。

Public Types

using T = typename C::T
using TI = typename C::TI
using RHC = ResultHandlerCompare<C, with_id_map>

公共函数

inline RangeHandler(RangeSearchResult &rres, float radius, size_t ntotal, const IDSelector *sel_in)
inline virtual void begin(const float *norms) override
inline virtual void handle(size_t q, size_t b, simd16uint16 d0, simd16uint16 d1) final

当计算 32 个距离并以两个 simd16uint16 提供时调用。(q,b)指示它是块中的哪个条目。

inline virtual void end() override
inline virtual void set_block_origin(size_t i0_in, size_t j0_in) final

设置正在计算的子矩阵

inline void adjust_with_origin(size_t &q, simd16uint16 &d0, simd16uint16 &d1)
inline int64_t adjust_id(size_t b, size_t j)
inline uint32_t get_lt_mask(uint16_t thr, size_t b, simd16uint16 d0, simd16uint16 d1)

return binary mask of elements below thr in (d0, d1) inverse_test returns elements above

公共成员

RangeSearchResult &rres
float radius
std::vector<uint16_t> thresholds
std::vector<size_t> n_per_query
size_t q0 = 0
std::vector<Triplet> triplets
bool disable
int64_t i0
int64_t j0
const IDSelector *sel
size_t nq
size_t ntotal
const idx_t *id_map = nullptr

这些字段主要用于 IVF 变体(with_id_map=true)

const int *q_map = nullptr
const uint16_t *dbias = nullptr
const float *normalizers = nullptr
bool is_CMax = false
uint8_t sizeof_ids = 0
bool with_fields = false
struct Triplet

公共成员

idx_t q
idx_t b
uint16_t dis
template<class C, bool with_id_map = false>
struct PartialRangeHandler : public faiss::simd_result_handlers::RangeHandler<C, false>

Public Types

using T = typename C::T
using TI = typename C::TI
using RHC = RangeHandler<C, with_id_map>

公共函数

inline PartialRangeHandler(RangeSearchPartialResult &pres, float radius, size_t ntotal, size_t q0, size_t q1, const IDSelector *sel_in)
inline void shift_n_per_query()
inline virtual void end() override
inline virtual void begin(const float *norms) override
inline virtual void handle(size_t q, size_t b, simd16uint16 d0, simd16uint16 d1) final

当计算出32个距离并且以两个simd16uint16提供时调用。(q, b) 指示它在块中的哪个条目。

inline virtual void set_block_origin(size_t i0_in, size_t j0_in) final

设置正在计算的子矩阵

inline void adjust_with_origin(size_t &q, simd16uint16 &d0, simd16uint16 &d1)
inline int64_t adjust_id(size_t b, size_t j)
inline uint32_t get_lt_mask(uint16_t thr, size_t b, simd16uint16 d0, simd16uint16 d1)

return binary mask of elements below thr in (d0, d1) inverse_test returns elements above

公共成员

RangeSearchPartialResult &pres
size_t q0
std::vector<Triplet> triplets
std::vector<size_t> n_per_query
RangeSearchResult &rres
float radius
std::vector<uint16_t> thresholds
bool disable = false
int64_t i0 = 0
int64_t j0 = 0
const IDSelector *sel
size_t nq
size_t ntotal
const idx_t *id_map = nullptr

这些字段主要用于 IVF 变体(with_id_map=true)

const int *q_map = nullptr
const uint16_t *dbias = nullptr
const float *normalizers = nullptr
bool is_CMax = false
uint8_t sizeof_ids = 0
bool with_fields = false