【发布时间】: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?
更具体地说:
- 是否可以将 3 个 mulps 分配到 3 个 SSE 乘法单元 (1),同时 (2) 将 addp 分配到各自的 SSE 加法单元,从而每个调度周期总共有 6 条指令?
- 如果我先运行 N 个 mullps,然后运行 N 个 addps - 哪个 N 是最佳的?
备注
- “计划”是指吞吐率。
【问题讨论】:
-
哇哇...你完全不在这儿了。 Core 2 处理器确实有 3 个 SSE 单元。但他们做不同的事情。 1 用于加法/减法。 1 用于乘法,1 用于洗牌。在这两个示例中,您永远不会获得超过 3 个周期的吞吐量。你会想读一点关于OOE 的内容。所以顺序应该没有太大关系。
-
即使你有一个能够同时进行这两种操作的单元,你仍然有一个通向它的端口
-
嗯...感谢您的澄清。将阅读这篇文章。
-
该顺序仅在没有 OOE 的 Intel Atom 上重要。
标签: optimization assembly x86 intel sse