diff --git a/D#0003-optimizing_cosine_distance_searching_in_a_million_feature-set/D#0003.md b/D#0003-optimizing_cosine_distance_searching_in_a_million_feature-set/D#0003.md index 245ffa0..675cee2 100644 --- a/D#0003-optimizing_cosine_distance_searching_in_a_million_feature-set/D#0003.md +++ b/D#0003-optimizing_cosine_distance_searching_in_a_million_feature-set/D#0003.md @@ -168,9 +168,10 @@ OpenMP是一种支持多平台共享存储器多处理器的C/C++编程规范和 ![](https://github.com/Captain1986/CaptainBlackboard/blob/master/D%230003-optimizing_cosine_distance_searching_in_a_million_feature-set/images/Selection_213.png) 测试结果: + ![](https://github.com/Captain1986/CaptainBlackboard/blob/master/D%230003-optimizing_cosine_distance_searching_in_a_million_feature-set/images/Selection_214.png) -速度63201us,加速大约**x2倍**。乘加数减少2倍,内存效率提升2倍,加速2倍符合预期。 +速度**63201us**,加速大约**x2倍**。乘加数减少2倍,内存效率提升2倍,加速2倍符合预期。 ### Step 12,浮点转定点 在很多通用CPU上,特别是计算能力有限的嵌入式设备中,浮点数的运算要比定点数的计算慢。如果我们把float型的已经归一化到[0.0,1.0]了的浮点型特征值(因为余弦距离只与向量夹角有关,与模还有分量的缩放取值范围无关,所以很容易做归一化),转换为[0,65536]的unsigned short定点类型,看看能不能有提升。 @@ -179,14 +180,21 @@ OpenMP是一种支持多平台共享存储器多处理器的C/C++编程规范和 (2)unsigned short替换float误差分析 问题描述:两个N维浮点向量X,Y,已经归一化到模为1,即![](https://github.com/Captain1986/CaptainBlackboard/blob/master/D%230003-optimizing_cosine_distance_searching_in_a_million_feature-set/images/Selection_216.png),其中![](https://github.com/Captain1986/CaptainBlackboard/blob/master/D%230003-optimizing_cosine_distance_searching_in_a_million_feature-set/images/Selection_217.png),归一化后的余弦距离![](https://github.com/Captain1986/CaptainBlackboard/blob/master/D%230003-optimizing_cosine_distance_searching_in_a_million_feature-set/images/Selection_218.png) 假设转定点数时把[0.0, 1.0] 映射到 [0, M], 则分量最大损失为1/M,考虑到四舍五入则为0.5/M。 -那么量化导入的误差为![](https://github.com/Captain1986/CaptainBlackboard/blob/master/D%230003-optimizing_cosine_distance_searching_in_a_million_feature-set/images/Selection_219.png),其中![](https://github.com/Captain1986/CaptainBlackboard/blob/master/D%230003-optimizing_cosine_distance_searching_in_a_million_feature-set/images/Selection_220.png),带入则有![](https://github.com/Captain1986/CaptainBlackboard/blob/master/D%230003-optimizing_cosine_distance_searching_in_a_million_feature-set/images/Selection_221.png),两遍加上取绝对值![](https://github.com/Captain1986/CaptainBlackboard/blob/master/D%230003-optimizing_cosine_distance_searching_in_a_million_feature-set/images/Selection_222.png). N是特征向量的维数,N=256,M是unsigned short可以表示的最大整形值,M=65536,带进去可以得知相似度的量化误差在万分之三以内。 +那么量化导入的误差为![](https://github.com/Captain1986/CaptainBlackboard/blob/master/D%230003-optimizing_cosine_distance_searching_in_a_million_feature-set/images/Selection_219.png),其中![](https://github.com/Captain1986/CaptainBlackboard/blob/master/D%230003-optimizing_cosine_distance_searching_in_a_million_feature-set/images/Selection_220.png),带入则有![](https://github.com/Captain1986/CaptainBlackboard/blob/master/D%230003-optimizing_cosine_distance_searching_in_a_million_feature-set/images/Selection_221.png),两遍加上取绝对值 + +![](https://github.com/Captain1986/CaptainBlackboard/blob/master/D%230003-optimizing_cosine_distance_searching_in_a_million_feature-set/images/Selection_222.png). + +N是特征向量的维数,N=256,M是unsigned short可以表示的最大整形值,M=65536,带进去可以得知相似度的量化误差在万分之三以内。 实际改动: + ![](https://github.com/Captain1986/CaptainBlackboard/blob/master/D%230003-optimizing_cosine_distance_searching_in_a_million_feature-set/images/Selection_223.png) 测试结果: + ![](https://github.com/Captain1986/CaptainBlackboard/blob/master/D%230003-optimizing_cosine_distance_searching_in_a_million_feature-set/images/Selection_224.png) -运行时间31298us,加速**x2.02倍**。主要原因在于乘加数没有增加,但是**内存效率提升了2倍**。如果换成4字节的unsigned int,实验证明速度没有什么提升。所以这里的定点化对速度提升的主要收益在于内存效率提升,而不在CPU的定点计算能力比浮点计算能力强。可能也是因为我是用的是PC电脑的通用CPU,浮点计算能力丝毫不逊色与定点计算,也许在嵌入式设备上会不一样。 + +运行时间**31298us**,加速**x2.02倍**。主要原因在于乘加数没有增加,但是**内存效率提升了2倍**。如果换成4字节的unsigned int,实验证明速度没有什么提升。所以这里的定点化对速度提升的主要收益在于内存效率提升,而不在CPU的定点计算能力比浮点计算能力强。可能也是因为我是用的是PC电脑的通用CPU,浮点计算能力丝毫不逊色与定点计算,也许在嵌入式设备上会不一样。 注意,上面的分析基于特征值没有归一化到[0,1]区间,模没有归一化到1,而且量化误差对相似度影响不大的基础上的,另外,也需要注意溢出问题。