Xi *_*han 7 c++ algorithm optimization performance
假设我有两个浮点数A和B的向量。我需要找到A和B的点积。sign(AB)-如果它是正数或负数或0。向量的大小很小,小于100。但是,我需要非常快地执行此操作!
您可以假设A中的所有元素都是[0,1]范围内的浮点数,B中的所有元素都是[-500,+ 500]。我一直在寻找精确的解决方案,但是如果实际上没有给出很多错误的答案,近似的解决方案也可以(我知道,“很多”是主观的,但是如果不谈论硬件或实现,我就无法在上面给出确切的数字) )
我使用-O4探索了速度最快的Pragma编译器指令。我探索了实现方面的更多改进,使其能够基于基础处理器的自动矢量化支持实现可并行化。像对于avx指令集一样,保留8个独立变量并找到点积,以便利用全部8个寄存器容量。但是我认为我们仍然可以更快!基本思想是,我们只需要确定点积的符号,因此在精度与速度之间进行权衡存在很大范围。因此,我正在尝试提出一些数学或算法解决方案来实现这种折衷。我的一个想法是使用FFT(快速傅立叶变换)来减少乘法次数。我尝试探索的另一个想法是按位技巧,但意识到按位进行浮动是不可能的。
您可能会想为什么优化如此小的任务如此重要,但是我认为这可能是一个非常有用的问题:
在现代架构上,点积的浮点计算已经非常快,加法将花费 1 个周期,乘法将花费 1-2 个周期。
归档时间: |
|
查看次数: |
116 次 |
最近记录: |