Skip to content

Commit

Permalink
格式调整
Browse files Browse the repository at this point in the history
  • Loading branch information
Captain1986 committed Feb 25, 2019
1 parent db3c7d8 commit bfe249d
Showing 1 changed file with 11 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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定点类型,看看能不能有提升。
Expand All @@ -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,而且量化误差对相似度影响不大的基础上的,另外,也需要注意溢出问题。
Expand Down

0 comments on commit bfe249d

Please sign in to comment.