鲲鹏社区首页
中文
注册
开发者
我要评分
获取效率
正确性
完整性
易理解
在线提单
论坛求助

特性介绍

本节介绍基于鲲鹏平台优化的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的局部连续性,可以提高缓存利用率和访问速度。

接口差异

表1 HNSW图构建接口

数据类型

接口

接口别名

FP32

HierarchicalNSWTemplat<float>

HierarchicalNSWFloat

FP16

HierarchicalNSWTemplate<float16_t>

HierarchicalNSWHalf

表2 距离计算空间接口

距离类型

数据类型

接口

接口别名

L2

FP32

L2SpaceTemplate<float>

L2SpaceF

FP16

L2SpaceTemplate<float16_t>

L2SpaceHalf

IP

FP32

InnerProductSpaceTemplate<float>

InnerProductSpaceF

FP16

InnerProductSpaceTemplate<float16_t>

InnerProductSpaceHalf

除上述接口差异外,其余接口与开源代码接口的使用方式保持一致。

距离计算实现差异

FP32和FP16的距离计算实现差异体现在加载数据类型不同。FP32距离计算加载FP32类型数据进行后续计算,FP16距离计算加载FP16类型数据并转换为FP32类型进行后续计算,二者均返回FP32数据类型的计算结果。以二者加载数据的NEON实现为例,代码如下所示。
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)); 
}