【问题标题】:How much cycles math functions take on modern processors现代处理器上数学函数需要多少周期
【发布时间】:2012-09-08 19:06:46
【问题描述】:

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

【问题讨论】:

  • 一些编译器出于优化或简单的原因产生对cossin 例程的调用。这些例程可能是汇编编码或纯 C 语言,可能使用或不使用处理器数学指令。而且这些指令可能比它们的软件例程对应物慢。当前的超标量乱序处理器没有明确定义的每条指令周期数。
  • 另外,由于架构的不同,不同的 CPU 对这些指令的时序也会不同。普通程序员的“最佳实践”是假设调用标准数学库函数将为您提供最佳性能(这些库将进行大量优化) - 但如果您深入了解细节,请查看 Agner Fog 的非常综合Instruction Timing Charts。干杯!
  • 你为什么问???为什么这对你很重要??其他方面对您也很重要(符合标准、计算结果的准确性……)。你在编写编译器吗??
  • fsin(和家人)现在很少使用。尤其是在 x64 上。

标签: c math gcc assembly x86-64


【解决方案1】:

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

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

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

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

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

如果您有其他询问的原因,您应该解释一下,以便重点回答。

【讨论】:

    【解决方案2】:

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

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

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

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

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

    对 SIMD 指令的改进要好得多。

    唯一有意义的事情是衡量,而不是假设。

    【讨论】:

    • 这是用于什么微架构的?
    • 好吧,我找不到它(仅作为 P4(不是核心),它适合 fmul 和 fsin 延迟和吞吐量,适合 fsqrt 吞吐量,但不适合它的延迟)。我无法理解 fdiv 的延迟/吞吐量 - ever 如何获得比乘法更低的延迟?而且 fsqrt 的延迟比吞吐量低 - DIV 单元累了,必须休息 5 个周期..?
    • @harold:可能 FSQRT 需要 FP_DIV 单元的 38 个周期和自定义逻辑中的 5 个周期,重新组织结果。
    • @HansPassant:我认为您的意思是 吞吐量的倒数,而不是 吞吐量
    • @harold:还请注意,Agner Fog 将 PIV 中的 FSQRT 延迟列为 43,并在其他地方表示英特尔未在其表中包含完整延迟,列出了一些延迟(例如:在执行之间移动数据单位)在“一般延迟”而不是在指令本身。
    猜你喜欢
    • 2015-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-30
    • 2021-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多