6个基本算术操作的相对周期时间是多少



当我尝试优化代码时,很长一段时间以来,我一直在使用一个经验法则,即加法和扣除价值1,乘法和除法值为3,平方价值3(我很少使用更通用的pow函数,所以我没有经验法则),而方形的价值为10。(我认为一个数字只是一个乘法,所以价值3。)

这是2D轨道模拟的示例。要计算重力加速并应用加速度,首先,我从船到地球中心的距离,然后计算加速度。

D = sqrt( sqr(Ship.x - Earth.x) + sqr(Ship.y - Earth.y) ); // this is worth 19
A = G*Earth.mass/sqr(D);                                   // this is worth 9, total is 28

但是,请注意,在计算D时,您将其取一个平方根,但是在下一个计算中使用它时,您将其保持平整。因此,您可以做到这一点:

A = G*Earth.mass/( sqr(Ship.x - Earth.x) + sqr(Ship.y - Earth.y) ); // this is worth 15

所以,如果我的经验法则是真的,我几乎将周期时间切成一半。

但是,我什至不记得我以前在哪里听到的规则。我想问这些基本算术操作的实际周期时间是多少?

假设:

  • 一切都是x64体系结构中的64位浮数。
  • 一切都已经加载到寄存器中,因此不用担心命中和记忆中的命中和错过。
  • 没有中断CPU
  • 否如果/分支逻辑,例如向前的预测

编辑:我想我真正想做的是看alu 内,仅计算其6个操作的逻辑的周期时间。如果其中仍然存在差异,请解释什么和原因。

注意:我没有看到机器代码的任何标签,因此我选择了下一个最近的东西,sourceberbly。需要明确的是,我谈论的是 X64 Architecture 中的实际机器代码操作。因此,我写的那些代码行是否在C#,C,JavaScript等中都没关系。我敢肯定,每种高级语言都会有自己的不同时间,因此我不想对此进行争论。我认为没有机器代码标签是可惜的,因为在谈论性能和/或操作时,您确实需要进入它。

至少必须了解一个操作至少有两个有趣的时间:延迟 the theput 。。P>

延迟

延迟是从其输入到其输出的任何特定操作所需的时间。如果您有一系列长的操作,其中一个操作的输出被输入下一个操作,则延迟将确定总时间。例如,最近的X86硬件上的整数乘法具有3个周期的延迟:完成单个乘法操作需要3个周期。整数添加的延迟为1个周期:结果可在添加后的循环中可用。潜伏期通常是积极的整数。

吞吐量

吞吐量是每单位时间可以执行的独立操作的数量。由于CPU是管道和超量表,因此这通常比潜伏期的倒数更重要。例如,在最近的X86芯片中,即使延迟为1个周期,也可以执行4个整数添加操作。同样,即使任何特定的乘法都需要3个周期来完成(这意味着您必须立即进行多个独立的乘法才能实现此目的)。

反吞吐量

在讨论指令性能时,通常将吞吐量数字作为"反吞吐量",这只是1 / throughput。这使得可以轻松地与延迟数字直接进行比较,而无需在脑海中进行分裂。例如,添加的反向吞吐量为0.25个周期,而不是1个周期的延迟,因此您可以立即看到,如果您有足够的独立添加,它们仅使用每个周期。

> 。

下面我将使用反吞吐量。

变量计时

最简单的说明具有固定的时间,至少在其reg-reg形式中。但是,一些更复杂的数学操作可能具有输入依赖性时机。例如,加法,减法和乘法通常在其整数和浮点形式中具有固定的时间,但是在许多平台上,整数,浮点或两者兼而有之。阿格纳(Agner)的数字通常显示出表示此范围的范围,但是您不应该假设操作数空间已经进行了广泛的测试,尤其是对于浮点。

例如,下面的Skylake数字显示较小的范围,但尚不清楚这是否是由于操作数依赖性(可能更大)或其他内容。

通过变性输入或本身是变性的结果可能会根据变性模式产生大量的额外成本。您在指南中看到的数字通常假定不符合义务,但是您也许可以在其他地方找到对每个操作的简单成本的讨论。

更多详细信息

以上是必要的,但通常不是足够的信息以完全限定绩效,因为您还有其他因素要考虑,例如执行端口竞争,前端瓶颈和很快。不过,这足以开始,如果我正确理解,您只要求"经验法则"。

Agner Fog

我推荐的测量潜伏期和反吞吐量数的来源是Agner的Fogs指南。您需要 4下的文件。指令表:Intel,AMD和通过CPUS 的指令潜伏期,吞吐量和微型操作分解的列表,该列出了各种AMD和Intel CPU上相当详尽的时机。您还可以直接从英特尔的指南中获得一些CPU的数字,但是我发现它们不如Agner's。

更难以使用。

下面我会为您感兴趣的基本操作提取几个现代CPU的数字。

英特尔Skylake

                         Lat  Inv Tpt
add/sub (addsd, subsd)     4      0.5
multiply (mulsd)           4      0.5
divide (divsd)         13-14        4
sqrt (sqrtpd)          15-16      4-6

因此,延迟的"经验法则"将添加/sub/mul所有成本为1,而划分和SQRT分别约为3和4。对于吞吐量,规则分别为1、8、8-12。还请注意,延迟比反吞吐量大得多,尤其是对于添加,sub和mul:如果您想达到最大吞吐量,则需要8个平行链操作链。

AMD Ryzen

                         Lat  Inv Tpt
add/sub (addsd, subsd)     3      0.5
multiply (mulsd)           4      0.5
divide (divsd)          8-13      4-5
sqrt (sqrtpd)          14-15      4-8

Ryzen数字与最近的英特尔广泛相似。加法和减法略低,乘法相同。从延迟角度来看,经验法则通常仍可以概括为1/3/4,用于添加,sub,mul/div/sqrt,并有一定的精度。

在这里,分隔的延迟范围很大,所以我希望它取决于数据。

最新更新