【问题标题】:Performance of different math functions in x86?x86 中不同数学函数的性能?
【发布时间】:2012-12-12 19:30:28
【问题描述】:

我正在编写一个 3D 碰撞,并且想知道基本数学函数的性能差异,例如 + - * / sqrt pwr trigonometry like sin cos tan arcsin..

我听说这取决于许多其他因素,所以我只是想大致了解哪个更慢并且需要避免,同时寻找解决问题的不同方法。我也想知道差异的顺序和大小

谢谢

编辑:我用 VC++ 为 x86 编写。但是其他架构和总体情况的知识也很好。主要是我在单浮点中计算实时应用。

问题是有些算法需要sqrt,或者三角函数,但是我可以通过其他方法绕过它们。每个人都有自己的进步,我想知道是否足以进行权衡。我想要一个通用知识来解决我自己的问题,做了一个谷歌但一无所获,所以请回答一下

【问题讨论】:

  • 为什么不自己进行基准测试呢?编写程序来执行您想要基准测试的任何运算符/功能,并让它打印出所花费的时间。
  • 真的取决于一百万个东西,目标cpu是什么?什么编译器?定点还是浮点?什么计算,因为有些会被优化成完全不同的东西等等。
  • 把你的算法草拟一下,当你遇到问题时提出问题,我们都会从输入中受益。
  • @code-gijoe: 不,这个很好的常识。这是一个很好的问题,应该投票而不是关闭。
  • @Postpi,我投票支持这个人。

标签: c++ performance math floating-point


【解决方案1】:

泛泛而谈,概括一下最近的常见硬件:

  • 加法、减法和乘法速度很快(每个内核每个周期至少可以进行一次运算)。
  • 除法和平方根通常慢一个数量级(每个操作数十个周期)。有许多近似算法可用于在一定程度上缩小这一差距以适应特定用途。
  • 调用数学库函数(sincosexplog 等)因您使用的数学库实现和硬件而异。在(例如)当前的 i7 上,通常介于每 ~20 个周期一次操作和每 ~200 个周期一次操作之间,具体取决于实现的质量和被调用的特定函数。

【讨论】:

  • 另外,对于复杂的数学库函数,float 版本可能比 double 版本更快。
  • 我想知道,当前的 CPU 的 FPU 中没有用于 sin/cos/... 的 LUT 吗?
  • @JonasWielicki:一般来说,没有。 x86 架构具有对 sin/cos 的硬件支持,但它比良好的软件实现慢得多,而且据我所知,它不是基于 LUT。大多数非 x86 平台(ARM、PPC 等)根本没有任何此类指令。
  • 好的,很高兴知道。我假设 FPU 比软件实现更快——硬件是否具有更好的准确性,或者根本没有理由使用它?
  • @JonasWielicki:今天没有充分的理由使用它。它的存在只是为了向后兼容。
【解决方案2】:

粗略的想法:+, - * / sqrt sin, cos, etc

附言。关于最新的英特尔架构:

ADDSD/SUBSD - 3 个周期延迟,1 个周期吞吐量

MULSD - 6-7 个周期延迟,2 个周期吞吐量

DIVSD - 38-39 周期延迟,38-39 周期吞吐量

【讨论】:

  • 对于大多数实际用途,在大多数现代硬件上,加法和乘法的性能是等效的;延迟可能不同,但吞吐量通常是平衡的。
  • 此外,您还可以为sqrt 和非代数函数(如sinexplog)提供专用硬件,这-IIRC-将返回一个浮点数一个 CPU 周期内的近似值。
  • @H2CO3:我知道没有硬件实现能够在单个周期内提供结果的超越函数;最常用的硬件实现(英特尔 x87 指令)是单指令但实际上比优秀的软件实现慢得多——根据英特尔优化手册,大约为 100-200 个周期。跨度>
  • @StephenCanon 是的,我的意思是单循环,而不仅仅是单指令——我敢肯定也存在一些。但是,我相信编译器和 libc 的创建者足够精通优化。
  • @chill:您列出的英特尔数字是针对 12 岁的 NetBurst 微架构的。根据英特尔的手册,当前数字是 ADDSD/SUBSD 的 3:1、MULSD 的 5:1 和 DIVSD 的 20:14。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-07
  • 1970-01-01
  • 2022-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多