文件 GpuIndex.h
-
namespace faiss
k-means 聚类算法的多种变体实现。
版权所有 (c) Facebook, Inc. 及其附属公司。
此源代码根据 MIT 许可证获得许可,该许可证位于此源树的根目录中的 LICENSE 文件中。
IDSelector 旨在定义要处理的向量子集(用于删除或作为搜索子集)
PQ4 SIMD 打包和累加函数
基本内核使用 bbs = nb * 2 * 16 个向量累加 nq 个查询向量,并生成该向量的输出矩阵。 对于 nq * nb <= 4 很有用,否则寄存器溢出变得太大。
这些函数的实现在 3 个 cpp 文件中展开,以减少并行编译时间。 模板被显式实例化。
此文件包含用于计算距离的内核的回调。
在整个库中,向量以 float * 指针的形式提供。 当批量处理(添加/搜索)多个向量时,大多数算法都可以优化。 在这种情况下,它们作为矩阵传递。 当提供大小为 d 的 n 个向量作为 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
定义一些对象,这些对象将转换应用于一组向量 通常这些是预处理步骤。
-
namespace gpu
函数
-
bool should_use_cuvs(GpuIndexConfig config_)
一个集中的函数,用于根据各种条件(例如不支持的架构)确定是否应使用 cuVS
-
struct GpuIndexConfig
由 faiss::gpu::GpuIndexBinaryFlatConfig, faiss::gpu::GpuIndexCagraConfig, faiss::gpu::GpuIndexFlatConfig, faiss::gpu::GpuIndexIVFConfig 继承
公共成员
-
int device = 0
索引所在的 GPU 设备。
-
MemorySpace memorySpace = MemorySpace::Device
用于主存储的内存空间。在 Pascal 及以上(CC 6+)架构上,允许 GPU 使用比 GPU 上可用内存更多的内存。
-
bool use_cuvs = false
索引是否应向下分派到 cuVS?
-
int device = 0
-
class GpuIndex : public faiss::Index
由 faiss::gpu::GpuIndexCagra, faiss::gpu::GpuIndexFlat, faiss::gpu::GpuIndexIVF 继承
公共函数
-
int getDevice() const
返回此索引所在的设备。
-
std::shared_ptr<GpuResources> getResources()
返回对我们的 GpuResources 对象的引用,该对象管理 GPU 上的内存、流和句柄资源
-
void setMinPagingSize(size_t size)
设置用于搜索的最小数据大小(以 MiB 为单位),对于这些搜索,我们使用 CPU -> GPU 分页
-
size_t getMinPagingSize() const
返回分页搜索的当前最小数据大小。
-
virtual void add(idx_t, const float *x) override
x
可以驻留在 CPU 或任何 GPU 上;根据需要执行复制 如果添加集太大,则处理分页添加;调用 addInternal_
-
virtual void add_with_ids(idx_t n, const float *x, const idx_t *ids) override
x
和ids
可以驻留在 CPU 或任何 GPU 上;根据需要执行复制。如果添加集太大,则处理分页添加;调用 addInternal_
-
virtual void assign(idx_t n, const float *x, idx_t *labels, idx_t k = 1) const override
x
和labels
可以驻留在 CPU 或任何 GPU 上;根据需要执行复制
-
virtual void search(idx_t n, const float *x, idx_t k, float *distances, idx_t *labels, const SearchParameters *params = nullptr) const override
x
、distances
和labels
可以驻留在 CPU 或任何 GPU 上;根据需要执行复制
-
virtual void search_and_reconstruct(idx_t n, const float *x, idx_t k, float *distances, idx_t *labels, float *recons, const SearchParameters *params = nullptr) const override
x
、distances
、labels
和recons
可以驻留在 CPU 或任何 GPU 上;根据需要执行复制
-
virtual void compute_residual(const float *x, float *residual, idx_t key) const override
覆盖以强制 GPU 索引提供其自己的 GPU 友好实现
保护函数
-
virtual bool addImplRequiresIDs_() const = 0
addImpl_ 是否需要 ID?如果是,并且未提供 ID,我们将根据添加 ID 的顺序按顺序生成它们
-
virtual void searchImpl_(idx_t n, const float *x, int k, float *distances, idx_t *labels, const SearchParameters *params) const = 0
重写以实际执行搜索操作。保证所有数据都驻留在我们的设备上。
保护属性
-
std::shared_ptr<GpuResources> resources_
管理设备上的流、cuBLAS 句柄和暂存内存。
-
const GpuIndexConfig config_
我们的配置选项。
-
size_t minPagedSize_
从 CPU 到 GPU 分页复制的大小阈值。
私有函数
-
void addPaged_(idx_t n, const float *x, const idx_t *ids)
如果添加集太大,则处理分页添加,传递给 addImpl_ 以实际执行当前页面的添加操作
-
void searchNonPaged_(idx_t n, const float *x, int k, float *outDistancesData, idx_t *outIndicesData, const SearchParameters *params) const
为单个 GPU 驻留数据页调用 searchImpl_。
-
void searchFromCpuPaged_(idx_t n, const float *x, int k, float *outDistancesData, idx_t *outIndicesData, const SearchParameters *params) const
为单个 GPU 驻留数据页调用 searchImpl_,处理数据的分页和从 CPU 的复制
-
int getDevice() const
-
bool should_use_cuvs(GpuIndexConfig config_)
-
namespace gpu