2014-01-23 72 views
1

英特爾酷睿2雙核有3個SSE單元。這些3個單元允許3個SSE指令被paralelly運行(1),例如:英特爾Core 2 Duo的3個SSE單元的優化mullps/addps指令

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);/

問題是followig:多少個循環,每個下面的2代碼段利用被調度?

代碼答:

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是最優的?

備註

  • 由 '計劃' 我的意思是吞吐率。
+5

哇!哇!在這裏。 Core 2處理器有3個SSE單元。但他們做了不同的事情。 1用於加/減。 1爲乘法,1爲混洗。在這兩個示例中,您都不會獲得超過3個週期的吞吐量。你會想讀一些關於[OOE](http://en.wikipedia.org/wiki/Out-of-order_execution)的內容。所以訂單不應該太重要。 – Mysticial

+0

即使你確實有一個能夠同時進行兩種操作的設備,你仍然會有一個通向它的單一端口 – Leeor

+0

呵呵......感謝您的澄清。將閱讀文章。 –

回答

0

請參閱Agner Fog's指令表,其指令可以在哪些執行單元上運行。和/或使用英特爾的代碼分析器(IACA)來查找吞吐量瓶頸(依賴鏈或端口爭用)。

正如評論者所說,並非所有的執行端口都可以處理FP MUL。它們都可以處理vector-int邏輯(AND/OR/XOR),但只有一個或兩個端口有一個向量洗牌單元或一個向量移位單元等等。