4

我们知道,现代处理器在处理器上直接执行指令,cosine因为sin它们有操作码。我的问题是这些指令通常需要多少周期。它们需要恒定时间还是取决于输入参数?

4

2 回答 2

13

时间因处理器型号而异。时间通常从几十个 CPU 周期到一百个或更多。

(许多指令消耗的时间因环境而异,因为指令使用处理器中的各种资源[调度程序、执行单元、重命名寄存器等],因此一条指令延迟其他工作多长时间取决于其他工作在处理器中。例如,如果某些代码几乎完全执行加载和存储指令,那么非常偶然的正弦指令可能根本不会减慢它的执行速度。但是,占用数十个 CPU 周期的指令通常受它们在执行单元,这是进行实际数值计算的部分。)

执行时间可能因输入参数而异。三角函数的大参数必须以 2π 为模减少,这本身就是一个复杂的问题。

在 Mac OS X 数学库中,我们通常使用汇编语言编写自己的实现,原因可能包括速度、符合标准、适用于应用程序二进制接口和其他特性。

如果您只是好奇,那么“数十到数百个处理器周期”可能是一个足够好的答案,尤其是在没有指定特定处理器型号的情况下。本质上,时间足够长,您不应该在没有充分理由的情况下使用这些操作。(例如,我已经看到获得 π 为 4·arctan(1) 的代码。不要那样做。)

如果您有其他询问的原因,您应该解释,以便答案可以集中。

于 2012-09-08T19:50:49.517 回答
9

很久以前,谈论现代处理器的“指令周期”变得很困难。如今的处理器包含多个执行核心,它们的操作可以重叠并且可以乱序执行。

英特尔处理器手册第 4 卷附录 C 中给出了基本考虑的一个很好的示例。它通过延迟和吞吐量分解了指令时序。延迟是执行内核完成微操作所需的周期数。吞吐量是执行单元再次接受同一指令所需的周期数。吞吐量通常低于延迟,包括在表中具有小数值。具有多个相同类型的执行单元的副作用。类型很重要,它告诉您指令是否可以重叠。

也许您在这里得到了基本信息:这在很大程度上取决于您对计时感兴趣的代码周围的其他指令。那些其他指令很可能与昂贵的指令同时执行。在这一点上,它们实际上需要 0 个周期。或者他们可能不会,因为执行单元正忙于前一条指令而停止流水线。编写代码优化器的程序员非常关心的那种细节。

手册中的一些示例数据,在表格​​中选择了最现代的核心:

  • FMUL,延迟 = 7,吞吐量 = 2,FP_MUL 执行单元
  • FDIV,延迟 = 6,吞吐量 = 5,未指定单位
  • FSQRT,延迟 = 38,吞吐量 = 43,FP_DIV 执行单元
  • FSIN,延迟 = 160-180,吞吐量 = 130,未指定单位

SIMD 指令的效果要好得多。

The only meaningful thing to do is measure, not assume.

于 2012-09-08T23:39:50.213 回答