我希望能夠手工預(yù)測(cè)確切的任意算術(shù)運(yùn)算時(shí)間(例如,沒(méi)有分支或內(nèi)存,盡管這也很好),但考慮到指令重新排序,超標(biāo)量,延遲,CPI等要實(shí)現(xiàn)此目標(biāo),必須遵循哪些/描述規(guī)則?我想我已經(jīng)弄清了一些初步規(guī)則,但是我無(wú)法找到將任何示例代碼分解到如此詳細(xì)級(jí)別的參考,因此我不得不做出一些猜測(cè)。(例如,英特爾優(yōu)化手冊(cè)幾乎沒(méi)有提到指令重新排序。)至少,我正在尋找(1)確認(rèn)每條規(guī)則正確或?qū)γ織l規(guī)則的正確陳述,以及(2)我可能忘記的任何規(guī)則的列表。每個(gè)周期發(fā)出盡可能多的指令,從當(dāng)前周期開(kāi)始按順序開(kāi)始,并且可能比重新排序緩沖區(qū)的大小提前。在以下情況下,可以在給定的周期內(nèi)發(fā)出指令:沒(méi)有影響其操作數(shù)的指令仍在執(zhí)行。和:如果是浮點(diǎn)指令,則在發(fā)出每個(gè)浮點(diǎn)指令之前(浮點(diǎn)指令具有靜態(tài)指令重排序)。和:該指令在該周期有一個(gè)功能單元。每個(gè)(?)功能單元都是流水線式的,這意味著對(duì)于給定功能類的CPI(每個(gè)模塊中的CPI不確定,例如,addps并subps使用相同的功能單位?如何確定?)。和:4在此循環(huán)中,已經(jīng)發(fā)出了少于超標(biāo)量寬度(通常為)的指令。如果沒(méi)有指令可以發(fā)出,則處理器根本不會(huì)發(fā)出任何指令,這種情況稱為“停頓”。作為示例,請(qǐng)考慮以下示例代碼(用于計(jì)算叉積):shufps xmm3, xmm2, 210shufps xmm0, xmm1, 201shufps xmm2, xmm2, 201mulps xmm0, xmm3shufps xmm1, xmm1, 210mulps xmm1, xmm2subps xmm0, xmm1我嘗試預(yù)測(cè)Haswell的延遲看起來(lái)像這樣:; `mulps` Haswell latency=5, CPI=0.5; `shufps` Haswell latency=1, CPI=1; `subps` Haswell latency=3, CPI=1shufps xmm3, xmm2, 210 ; cycle 1shufps xmm0, xmm1, 201 ; cycle 2shufps xmm2, xmm2, 201 ; cycle 3mulps xmm0, xmm3 ; (superscalar execution)shufps xmm1, xmm1, 210 ; cycle 4mulps xmm1, xmm2 ; cycle 5 ; cycle 6 (stall `xmm0` and `xmm1`) ; cycle 7 (stall `xmm1`) ; cycle 8 (stall `xmm1`)subps xmm0, xmm1 ; cycle 9 ; cycle 10 (stall `xmm0`)
預(yù)測(cè)現(xiàn)代超標(biāo)量處理器上的操作延遲需要考慮哪些因素,我該如何手動(dòng)計(jì)算它們?
四季花海
2019-10-12 13:36:46