特性介绍
本节介绍基于鲲鹏平台优化的hnswlib特性,包括对hnswlib优化的特性和差异说明。特性说明包括向量化、支持FP16数据类型的实现、预取优化以及指令重排优化。除本节介绍的接口差异其余接口与开源代码接口的使用方式保持一致。
向量化
在距离计算的部分,使用SVE和NEON向量化指令代替原生的SSE和AVX实现。
以16个float并行执行L2距离计算为例。针对ARM进行NEON实现,使用vld1指令,每次加载4个FP32数据,循环展开4次处理16个FP32数据。
支持FP16数据类型
在距离计算的部分,增加了对FP16数据类型的计算支持。
针对鲲鹏平台使用NEON指令实现距离计算,使用vld1指令,每次加载4个FP16数据转换为float数据进行计算,循环展开4次处理16个FP16数据。
预取优化
在hnswlib搜索层次化图的算法中,使用预取方法,将用于记录节点访问状态的数组和用于根据节点的内部ID获取该节点的数据指针加载到缓存中,以减少后续访问的延迟。
指令重排优化
指令重排优化HNSW图的节点ID,在保持图拓扑结构不变的前提下,最大化邻居节点ID的局部连续性,可以提高缓存利用率和访问速度。
接口差异
数据类型 |
接口 |
接口别名 |
|---|---|---|
FP32 |
HierarchicalNSWTemplat<float> |
HierarchicalNSWFloat |
FP16 |
HierarchicalNSWTemplate<float16_t> |
HierarchicalNSWHalf |
距离类型 |
数据类型 |
接口 |
接口别名 |
|---|---|---|---|
L2 |
FP32 |
L2SpaceTemplate<float> |
L2SpaceF |
FP16 |
L2SpaceTemplate<float16_t> |
L2SpaceHalf |
|
IP |
FP32 |
InnerProductSpaceTemplate<float> |
InnerProductSpaceF |
FP16 |
InnerProductSpaceTemplate<float16_t> |
InnerProductSpaceHalf |
除上述接口差异外,其余接口与开源代码接口的使用方式保持一致。
距离计算实现差异
if constexpr (std::is_same_v<T, float>) {
v1 = vld1q_f32(pVect1);
v2 = vld1q_f32(pVect2);
} else if constexpr (std::is_same_v<T, float16_t>) {
v1 = vcvt_f32_f16(vld1_f16(pVect1));
v2 = vcvt_f32_f16(vld1_f16(pVect2));
}