gpt4 book ai didi

c++ - 如何权衡精度和速度以评估 C++ 中两个 vector 的点积符号? (不是硬件特定的)

转载 作者:可可西里 更新时间:2023-11-01 18:39:21 24 4
gpt4 key购买 nike

假设我有两个浮点 A 和 B vector 。我需要找到 A 和 B 的点积,即。 sign(A.B) - 如果它是正数或负数或 0。 vector 的大小很小,小于 100。但是,我需要非常快地执行此操作!
你可以假设A中的所有元素都是[0,1]范围内的 float ,而B中的所有元素都是[-500,+500]。我一直在寻找精确的解决方案,但如果实际上没有给出很多错误的答案,近似的解决方案也会这样做(我知道,“很多”是主观的,但我不能在不谈论硬件或实现的情况下给出确切的数字)

我探索了使用 -O4 运行最快的 Pragma 编译器指令。我在实现中探索了一些更多的改进,以使其基于底层处理器的自动矢量化支持而可并行化。和avx指令集一样,保留8个自变量求点积,这样8个寄存器的容量就都用完了。但我认为我们还可以更快!基本思想是,我们只需要确定点积的符号,所以有很大的空间来权衡精度和速度。所以我试图想出一些数学或算法解决方案来实现这种权衡。我的一个想法是使用 FFT(快速傅里叶变换)来减少乘法次数。我尝试探索的另一个想法是按位技巧,但意识到按位对 float 是不可能的。 (当您使用像 Ofast 或 O3 这样的快速 pragma 时,IEEE 标准不被保证)

您可能会想为什么优化这样的小任务如此重要,但我认为这可能是一个非常有用的问题:-

  • 针对此问题的创造性解决方案可以推广到其他类似情况,这些情况需要在精度与速度之间进行权衡。
  • 点积的符号是一个应用非常广泛的子问题,它在十几种场景中都有体现(想想复数运算、几种 ML 算法中的超平面等)

最佳答案

在现代架构上,点积的浮点计算已经非常快,加法需要1个周期,乘法需要1-2个周期。

  1. 我认为只有在计算大量点积时性能才重要。
  2. 通常这意味着必须读取大量数据
  3. 这意味着运行时将由内存带宽决定。
  4. 这意味着,只有使用较小的浮点类型(即 32 位或 16 位 float )才能获得较大的性能提升。

关于c++ - 如何权衡精度和速度以评估 C++ 中两个 vector 的点积符号? (不是硬件特定的),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56577903/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com