文件 simdlib_avx2.h

namespace faiss

实现了具有多种变体的 k-means 聚类。

版权所有 (c) Facebook, Inc. 及其附属公司。

此源代码根据 MIT 许可证获得许可,该许可证位于此源代码树的根目录中的 LICENSE 文件中。

IDSelector 旨在定义要处理的向量子集(用于删除或作为搜索的子集)

PQ4 SIMD 打包和累加函数

基本内核使用 bbs = nb * 2 * 16 个向量累加 nq 查询向量,并生成该向量的输出矩阵。对于 nq * nb <= 4 来说是很有意思的,否则寄存器溢出量太大。

这些函数的实现分布在 3 个 cpp 文件中,以减少并行编译时间。模板被显式实例化。

此文件包含用于计算距离的内核的回调。

在整个库中,向量以 float * 指针的形式提供。当批量处理(添加/搜索)多个向量时,大多数算法都可以得到优化。 在这种情况下,它们作为矩阵传递。 当 n 个大小为 d 的向量作为 float * x 提供时,向量 i 的分量 j 是

x[ i * d + j ]

其中 0 <= i < n 且 0 <= j < d。 换句话说,矩阵始终是紧凑的。 在指定矩阵的大小时,我们称其为 n*d 矩阵,这意味着行优先存储。

I/O 函数可以读取/写入到文件名、文件句柄或抽象介质的对象。

读取函数返回的对象应该使用 delete 释放。这些对象中的所有引用都归该对象所有。

倒排列表的定义 + 一些实现接口的常用类。

由于 IVF(倒排文件)索引对于大规模用例非常有用,因此我们将一些与其相关的函数分组到这个小库中。 大多数函数都适用于 IndexIVF 和嵌入在 IndexPreTransform 中的 IndexIVF。

此文件中实现了 L2 和内积之外的额外指标

实现了一些神经网络层,主要用于支持 QINCo

定义了一些对一组向量应用转换的对象 通常这些是预处理步骤。

函数

inline simd16uint16 min(simd16uint16 a, simd16uint16 b)
max 函数:返回两个 `simd16uint16` 向量中对应元素的最大值。
combine2x2 函数:组合两个 `simd16uint16` 向量。
cmp_ge32 函数:比较两个 `simd16uint16` 向量之差是否大于或等于第三个 `simd16uint16` 向量的每个元素,返回一个 `uint32_t` 类型的位掩码。
cmp_le32 函数:比较两个 `simd16uint16` 向量之差是否小于或等于第三个 `simd16uint16` 向量的每个元素,返回一个 `uint32_t` 类型的位掩码。
hadd 函数:将两个 `simd16uint16` 向量的对应元素进行水平加法。
cmplt_min_max_fast 函数:快速比较候选值和当前值,并更新最小值和最大值及其对应的索引。
uint16_to_uint8_saturate 函数:将两个 `simd16uint16` 向量饱和转换为 `simd32uint8` 向量。
get_MSBs 函数:从 `simd32uint8` 向量中获取每个字节的最高有效位(MSB),并返回一个 `uint32_t` 值。

获取每个字节的最高有效位

blendv 函数:使用掩码中每个字节的最高有效位 (MSB) 在两个 `simd32uint8` 向量 a 和 b 之间选择字节。

使用掩码中每个字节的 MSB 在 a 和 b 之间选择一个字节

内联函数,用于快速比较候选值和当前值,并更新最小值和最大值及其索引。
内联函数,对两个`simd8float32`向量进行水平加法。
内联函数,用于解包两个`simd8float32`向量的低位部分。
内联函数,用于解包两个`simd8float32`向量的高位部分。
内联函数,执行融合乘加运算:`a * b + c`,针对`simd8float32`向量。
内联函数,如果候选值小于当前最小值,则用候选值及其索引更新最小值和索引(就地操作),针对`simd8float32`和`simd8uint32`向量。
内联函数,用于快速比较候选值和当前值,并更新最小值和最大值及其索引。使用`simd8float32`和`simd8uint32`向量。
结构体,表示 256 位 SIMD 数据。
包含 <simdlib_avx2.h> 头文件。

不作为向量解释的 256 位表示。

围绕 AVX 256 位寄存器的简单封装。

目标是分离同一寄存器的不同解释(作为 uint8、uint16 或 uint32 的向量),提供打印功能,并为 AVX 内联函数提供更具可读性的名称。 它并不声称是详尽的,函数会根据需要添加。

被以下类继承:faiss::simd16uint16, faiss::simd16uint16, faiss::simd16uint16, faiss::simd32uint8, faiss::simd32uint8, faiss::simd32uint8, faiss::simd8float32, faiss::simd8float32, faiss::simd8float32, faiss::simd8uint32, faiss::simd8uint32, faiss::simd8uint32

公共函数

inline simd256bit()
inline explicit simd256bit(__m256i i)
inline explicit simd256bit(__m256 f)
inline explicit simd256bit(const void *x)
inline void clear()
inline void storeu(void *ptr) const
inline void loadu(const void *ptr)
inline void store(void *ptr) const
inline void bin(char bits[257]) const
inline std::string bin() const
inline bool is_same_as(simd256bit other) const

公共成员

__m256i i
__m256 f
union faiss::simd256bit::[anonymous] [anonymous]
struct simd16uint16 : public faiss::simd256bit, public faiss::simd256bit, public faiss::simd256bit
包含 <simdlib_avx2.h> 头文件。

uint16中16个元素的向量

公共函数

inline simd16uint16()
inline explicit simd16uint16(__m256i i)
inline explicit simd16uint16(int x)
inline explicit simd16uint16(uint16_t x)
inline explicit simd16uint16(simd256bit x)
inline explicit simd16uint16(const uint16_t *x)
inline explicit simd16uint16(uint16_t u0, uint16_t u1, uint16_t u2, uint16_t u3, uint16_t u4, uint16_t u5, uint16_t u6, uint16_t u7, uint16_t u8, uint16_t u9, uint16_t u10, uint16_t u11, uint16_t u12, uint16_t u13, uint16_t u14, uint16_t u15)
inline std::string elements_to_string(const char *fmt) const
inline std::string hex() const
inline std::string dec() const
inline void set1(uint16_t x)
inline simd16uint16 operator*(const simd16uint16 &other) const
inline simd16uint16 operator>>(const int shift) const
inline simd16uint16 operator<<(const int shift) const
inline simd16uint16 operator+=(simd16uint16 other)
inline simd16uint16 operator-=(simd16uint16 other)
inline simd16uint16 operator+(simd16uint16 other) const
inline simd16uint16 operator-(simd16uint16 other) const
inline simd16uint16 operator&(simd256bit other) const
inline simd16uint16 operator|(simd256bit other) const
inline simd16uint16 operator^(simd256bit other) const
inline simd16uint16 operator~() const
inline uint16_t get_scalar_0() const
inline uint32_t ge_mask(simd16uint16 thresh) const
inline uint32_t le_mask(simd16uint16 thresh) const
inline uint32_t gt_mask(simd16uint16 thresh) const
inline bool all_gt(simd16uint16 thresh) const
inline uint16_t operator[](int i) const
inline void accu_min(simd16uint16 incoming)
inline void accu_max(simd16uint16 incoming)
inline void storeu(void * ptr) const
内联函数,从 ptr 指向的内存地址加载数据。
内联函数,将数据存储到 ptr 指向的内存地址。
内联函数,检查当前对象是否与另一个 simd256bit 对象相同。

公共成员

__m256i 类型的成员变量。
__m256 类型的成员变量。
匿名联合体。

友元函数

内联友元函数,重载等于运算符 (==),用于比较两个 simd256bit 对象是否相等。
结构体,公开继承自 faiss::simd256bit 三次。

公共函数

内联构造函数。
内联显式构造函数,使用 __m256i 初始化。
内联显式构造函数,使用 int 初始化。
内联显式构造函数,使用 uint8_t 初始化。
内联显式构造函数,使用 simd256bit 初始化。
内联显式构造函数,使用 uint8_t 数组初始化。
内联函数,将元素转换为字符串,使用指定的格式 fmt
内联函数,将元素转换为十六进制字符串。
内联函数,将元素转换为十进制字符串。
内联函数,将所有元素设置为相同的值 x
内联 simd32uint8 operator&(simd256bit other) const
内联 simd32uint8 operator+(simd32uint8 other) const
内联 simd32uint8 lookup_2_lanes(simd32uint8 idx) const
内联 simd16uint16 lane0_as_uint16() const
内联 simd16uint16 lane1_as_uint16() const
内联 simd32uint8 operator+=(simd32uint8 other)
内联 uint8_t operator[](int i) const
内联 void storeu(void * ptr) const
内联 void loadu(const void * ptr)
内联 void store(void * ptr) const
内联 bool is_same_as(simd256bit other) const

公共成员

__m256i i
__m256 f
union faiss::simd256bit::[anonymous]

公共静态函数

template<uint8_t _0, uint8_t _1, uint8_t _2, uint8_t _3, uint8_t _4, uint8_t _5, uint8_t _6, uint8_t _7, uint8_t _8, uint8_t _9, uint8_t _10, uint8_t _11, uint8_t _12, uint8_t _13, uint8_t _14, uint8_t _15, uint8_t _16, uint8_t _17, uint8_t _18, uint8_t _19, uint8_t _20, uint8_t _21, uint8_t _22, uint8_t _23, uint8_t _24, uint8_t _25, uint8_t _26, uint8_t _27, uint8_t _28, uint8_t _29, uint8_t _30, uint8_t _31>
static inline simd32uint8 create()
struct simd8uint32 : public faiss::simd256bit, public faiss::simd256bit, public faiss::simd256bit
包含 <simdlib_avx2.h> 头文件。

vector of 8 unsigned 32-bit integers

公共函数

inline simd8uint32()
inline explicit simd8uint32(__m256i i)
inline explicit simd8uint32(uint32_t x)
inline explicit simd8uint32(simd256bit x)
inline explicit simd8uint32(const uint8_t *x)
inline explicit simd8uint32(uint32_t u0, uint32_t u1, uint32_t u2, uint32_t u3, uint32_t u4, uint32_t u5, uint32_t u6, uint32_t u7)
inline simd8uint32 operator+(simd8uint32 other) const
inline simd8uint32 operator-(simd8uint32 other) const
inline simd8uint32 &operator+=(const simd8uint32 &other)
inline bool operator==(simd8uint32 other) const
inline bool operator!=(simd8uint32 other) const
inline std::string elements_to_string(const char *fmt) const
inline std::string hex() const
inline std::string dec() const
inline void set1(uint32_t x)
inline simd8uint32 unzip() const
inline void storeu(void *ptr) const
inline void loadu(const void *ptr)
inline void store(void *ptr) const
inline bool is_same_as(simd256bit other) const

公共成员

__m256i i
__m256 f
union faiss::simd256bit::[anonymous] [anonymous]
struct simd8float32 : public faiss::simd256bit, public faiss::simd256bit, public faiss::simd256bit

公共函数

inline simd8float32()
inline explicit simd8float32(simd256bit x)
inline explicit simd8float32(__m256 x)
inline explicit simd8float32(float x)
inline explicit simd8float32(const float *x)
inline explicit simd8float32(float f0, float f1, float f2, float f3, float f4, float f5, float f6, float f7)
inline simd8float32 operator*(simd8float32 other) const
inline simd8float32 operator+(simd8float32 other) const
inline simd8float32 operator-(simd8float32 other) const
inline simd8float32 &operator+=(const simd8float32 &other)
inline bool operator==(simd8float32 other) const
inline bool operator!=(simd8float32 other) const
inline std::string tostring() const
inline void storeu(void *ptr) const
inline void loadu(const void *ptr)
inline void store(void *ptr) const
inline bool is_same_as(simd256bit other) const

公共成员

__m256i i
__m256 f
union [anonymous]