在x86中表现不同的数学函数?

Le *_*Duc 7 c++ math floating-point performance

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

我听说这取决于许多其他事情,所以我只是想大致了解哪一个更慢,需要避免,同时找到解决问题的不同方法.另外,我想知道差异的顺序和大小

谢谢

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

问题是一些算法需要sqrt或三角函数,但我可以通过其他方法绕过它们.每个人都有自己的进步,我想知道足以做出权衡.我想要一般知识来解决我自己的问题,做了一个谷歌,但没有找到任何所以请让它回答

Ste*_*non 6

讲得非常广泛,并概括了最近的常见硬件:

  • 加法,减法和乘法很快(每个核心每个周期能够至少进行一次操作).
  • 除法和平方根通常约慢一个数量级(每个操作数十个周期).有许多近似算法可用于缩小这种差距以适应特定用途.
  • 调用数学库函数(sin,cos,exp,log,等)变化显著取决于你使用的是什么数学库的实现和在什么硬件.在(比方说)电流i7上,每隔约20个周期的操作和每~200个周期的操作之间的某种情况是典型的,这取决于实现的质量和被调用的特定功能.

  • 此外,对于复杂的数学库函数,“float”版本可能比“double”版本更快。 (2认同)

chi*_*ill 2

大概的想法:+, -<<<<*/sqrtsin, cos, etc

附言。在最新的英特尔架构上:

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

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

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

  • @chill:您列出的 Intel 数字适用于已有 12 年历史的 NetBurst 微架构。根据英特尔手册,ADSD/SUBSD 的当前数字为 3:1,MULSD 为 5:1,DIVSD 为 20:14。 (4认同)