【问题标题】:Optimal mullps/addps instructions order for 3 SSE units for Intel Core 2 Duo英特尔酷睿 2 双核的 3 个 SSE 单元的最佳 mullps/addps 指令顺序
【发布时间】:2014-02-14 14:46:21
【问题描述】:

众所周知,Intel Core 2 Duo 有 3 个 SSE 单元。这3个单元允许3个SSE指令并行运行(1),例如:

rA0 = mullps(rB0, rC0);   \
rA1 = mullps(rB1, rC1);    > All 3 take 1 cycle to be scheduled (* - see Remarks).
rA2 = mullps(rB2, rC2);   /

众所周知,每个 SSE 单元由 2 个模块组成:一个用于加法(减法),一个用于乘法(除法)。后者允许并行运行 mullps-addps 指令序列(2),例如:

rA0 = mullps(rB0, rC0); \
                         > All 2 take 1 cycle to be scheduled for 1 SSE module.
rA1 = addps(rB1, rC1);  /

问题如下:以下2个代码sn-ps中的每一个需要多少周期才能被调度?

代码清单 A:

rA0 = mullps(rB0, rC0);  \ 
rA1 = mullps(rB1, rC1);   |  
rA2 = mullps(rB2, rC2);   \ Do all 6 execute in one step? (See paragraph (2))
rA3 = addps(rB3, rC3);    /
rA4 = addps(rB4, rC4);    | 
rA5 = addps(rB5, rC5);   /

代码清单 B:

rA0 = mullps(rB0, rC0);  \ 
rA1 = addps(rB1, rC1);    |  
rA2 = mullps(rB2, rC2);    \ Do all 6 execute in one step?  (See paragraph (1))
rA3 = addps(rB3, rC3);     /
rA4 = mullps(rB4, rC4);   | 
rA5 = addps(rB5, rC5);   /

我应该更喜欢哪种指令排序方式,A 还是 B?

更具体地说:

  1. 是否可以将 3 个 mulps 分配到 3 个 SSE 乘法单元 (1),同时 (2) 将 addp 分配到各自的 SSE 加法单元,从而每个调度周期总共有 6 条指令?
  2. 如果我先运行 N 个 mullps,然后运行 ​​N 个 addps - 哪个 N 是最佳的?

备注

  • “计划”是指吞吐率。

【问题讨论】:

  • 哇哇...你完全不在这儿了。 Core 2 处理器确实有 3 个 SSE 单元。但他们做不同的事情。 1 用于加法/减法。 1 用于乘法,1 用于洗牌。在这两个示例中,您永远不会获得超过 3 个周期的吞吐量。你会想读一点关于OOE 的内容。所以顺序应该没有太大关系。
  • 即使你有一个能够同时进行这两种操作的单元,你仍然有一个通向它的端口
  • 嗯...感谢您的澄清。将阅读这篇文章。
  • 该顺序仅在没有 OOE 的 Intel Atom 上重要。

标签: optimization assembly x86 intel sse


【解决方案1】:

请参阅Agner Fog's 指令表,了解哪些指令可以在哪些执行单元上运行。和/或使用英特尔的代码分析器 (IACA) 来查找吞吐量瓶颈(依赖链或端口争用)。

正如评论者所说,并非所有执行端口都可以处理 FP MUL。它们都可以处理向量整型逻辑(AND/OR/XOR),但只有一个或两个端口具有向量混洗单元或向量移位单元等。

【讨论】:

    猜你喜欢
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-08
    • 2018-08-12
    • 2013-10-25
    • 1970-01-01
    • 2019-01-15
    相关资源
    最近更新 更多