针对Intel Core 2 Duo的3个SSE单元的最佳mullps / addps指令

时间:2014-01-23 20:25:34

标签: optimization assembly x86 intel sse

众所周知,英特尔酷睿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?

更具体地说:

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

    • by' scheduled'我的意思是吞吐率。

1 个答案:

答案 0 :(得分:0)

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

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