众所周知,英特尔酷睿2双核处理器有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个代码段中的每个代码片段需要安排多少个周期?
代码清单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?
更具体地说:
说明
答案 0 :(得分:0)
请参阅Agner Fog's指令表,了解哪些指令可在哪些执行单元上运行。和/或使用英特尔的代码分析器(IACA)来查找吞吐量瓶颈(依赖链或端口争用)。
正如评论者所说,并非所有执行端口都可以处理FP MUL。它们都可以处理vector-int逻辑(AND / OR / XOR),但只有一个或两个端口有一个矢量shuffle单元,或一个矢量移位单元等等。