当前位置: 首页 > 知识库问答 >
问题:

如何在计算C中两个向量的点积符号时,权衡精度和速度?(非特定于硬件)

祁辰阳
2023-03-14

假设我有浮点数A和B的两个向量,我需要找到A和B的点积,即符号(A. B)-如果它是正的或负的或0。向量的大小很小,小于100。然而,我需要非常快地做到这一点!
您可以假设A中的所有元素都是[0,1]范围内的浮点数,B的元素是[-500,500]。我在寻找精确的解决方案,但是如果实际上没有给出很多错误的答案,近似的html" target="_blank">html" target="_blank">解决方案也可以做到(我知道,“很多”是主观的,但是我不能在不谈论硬件或实现的情况下给它一个精确的数字)

我探索了使用-O4工作最快的Pragma编译器指令。我探索了实现中的一些更多改进,使其基于底层处理器的自动矢量化支持可并行化。就像avx指令集一样,保持8个自变量并找到点积,这样寄存器容量的所有8个都被利用了。但我认为我们仍然可以更快!基本想法是,我们只需要确定点积的符号,因此有很大的空间来权衡精度以提高速度。所以我试图想出一些数学或算法解决方案来实现这种权衡。我的一个想法是使用FFT(快速傅里叶变换)来减少乘法的数量。我试图探索的另一个想法是按位技巧,但意识到浮点数按位是不可能的。(当您使用像奥法斯特或O3这样的快速实用程序时,IEEE标准不会受到限制)

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

  • 这个问题的创造性解决方案可以推广到其他需要精确而不是速度权衡的类似情况。
  • 点积符号是一个非常广泛适用的子问题,它出现在十几种场景中(想想复数操作,几个ML算法中的超平面等)

共有1个答案

姜鹏程
2023-03-14

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

  1. 我认为性能只有在计算大量点积时才重要。
  2. 通常这意味着必须读取大量数据
  3. 这意味着运行时将由内存带宽主导。
  4. 这意味着,只有使用较小的浮点类型,即32位或16位浮点数,才能获得较大的性能提升。
 类似资料:
  • 问题内容: 如何在Java中计算两个角度量度(以度为单位)的差,使结果在[0°,180°]范围内? 例如: 问题答案: /* * Shortest distance (angular) between two angles. * It will be in range [0, 180]. / public static int distance(int alpha, int beta) { int

  • 问题内容: 如何找到向量之间的余弦相似度? 我需要找到相似性来衡量两行文本之间的相关性。 例如,我有两个句子: 用户界面系统 用户界面机 …及其在tF-idf之后的向量,然后使用LSI进行标准化,例如 和。 如何测量这些向量之间的相似性? 问题答案: 我最近在大学的信息检索部门做了一些tf-idf的工作。我使用了这种余弦相似度方法,该方法使用Jama:Java Matrix Package 。 有

  • 问题内容: 我正在尝试计算python中两条线之间的角度。我搜索了互联网,找到了如何做的方程式。但是我并不总是能得到准确的结果。当其他结果似乎正确时,其中一些结果显然是错误的。我的代码如下: 它产生的结果是: 问题是我不明白为什么第二个结果,第五个和最后一个结果被归零,因为它们共享一个点,而另一个点却不重复,因为数组中的值不同。 问题答案: 看起来您正在使用Python2,如果两个参数均为int

  • 我正在制作一个AndroidJava程序,它从用户那里获得双倍的值。如果我在电脑上运行这个程序,它会很好地工作,因为我的电脑的语言环境,EN_UK。但是当我在手机上用FI_FI语言环境运行它时,它就不起作用了。我知道原因:在英国,人们用点作为十进制分隔符,但是在芬兰,十进制分隔符是逗号。 当我使用逗号时,它说。 我怎样才能同时使用逗号和圆点呢?

  • 问题内容: 我希望能够估算两个(纬度,经度)点之间的距离。我想下冲,因为这将用于A 图形搜索,并且我希望它能 快速* 。这些点最多相距800公里。 问题答案: Python中Haversine公式的答案(两个GPS点之间的轴承和距离)提供了可以回答您问题的Python实现。 使用下面的实现,我在一台旧笔记本电脑上 不到1秒的 时间内 执行了100,000次迭代 。我认为对于您来说,这应该足够了。但

  • 问题内容: 我正在下载文件,但是对于大文件,我每次都需要检查磁盘上文件的大小,因为我无法以百分比形式显示进度,并且我也想知道下载速度。我该怎么做呢?这是我的代码: 我认为一种方法是在循环中每次读取文件并根据标头计算进度百分比。但是对于大文件(大约500MB),这将再次成为问题。还有其他方法吗? 问题答案: 参见此处:Python进度栏和下载 我认为代码将是这样,它应该显示 自开始以来 的 平均速度