文件 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 bool is_same_as(simd256bit other) const
-
inline simd256bit()
-
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 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
对象是否相等。
-
inline simd16uint16()
-
结构体,公开继承自
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
公共静态函数
-
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 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
-
inline simd8uint32()
-
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 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]
-
inline simd8float32()
-
inline simd16uint16 min(simd16uint16 a, simd16uint16 b)