最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

【轉(zhuǎn)】Intel, AMD及VIA CPU的微架構(gòu)(32)

2023-09-02 19:21 作者:小林家的垃圾王R  | 我要投稿

Intel, AMD及VIA CPU的微架構(gòu)(32)

wuhui_gdnt

于 2019-01-18 11:53:49 發(fā)布

335

?收藏?1

分類專欄:?Agner Fog編寫(xiě)的優(yōu)化手冊(cè)

Agner Fog編寫(xiě)的優(yōu)化手冊(cè)專欄收錄該內(nèi)容

65 篇文章15 訂閱

訂閱專欄

13. Intel Silvermont流水線

在中僅有小打小鬧的幾年后,低功耗的Atom設(shè)計(jì)最終邁出了一大步?,F(xiàn)在Silvermont處理器是ARM處理器的一個(gè)有力競(jìng)爭(zhēng)者。對(duì)整數(shù)指令,它有有限的亂序執(zhí)行能力,但對(duì)浮點(diǎn)與向量指令沒(méi)有。它支持SSE4.2指令,但不支持AVX。

流水線有14級(jí),而之前的Atom設(shè)計(jì)有16級(jí)。3級(jí)用于指令獲取,3級(jí)用于指令解碼,2級(jí)用于寄存器分配與重命名,1級(jí)用于調(diào)度,1及用于執(zhí)行,4級(jí)用于回收與提交。更短的流水線據(jù)說(shuō)將分支誤預(yù)測(cè)懲罰降低到了10時(shí)鐘周期,不過(guò)我的測(cè)試顯示大約12個(gè)時(shí)鐘周期,幾乎與Atom相同。

芯片有1到4個(gè)帶有2個(gè)執(zhí)行核的單元,總共最多8線程。一個(gè)單元里的2個(gè)核共享2級(jí)緩存,但不共享流水線或執(zhí)行資源。

13.1. 流水線

Slivermont有5條流水線:一個(gè)用于內(nèi)存讀寫(xiě)操作,兩個(gè)用于整數(shù)操作,兩個(gè)用于浮點(diǎn)與向量操作。最大平均吞吐率是每時(shí)鐘周期兩條指令,在兩條指令去往不同的流水線時(shí)實(shí)現(xiàn)。

兩個(gè)整數(shù)流水線可以亂序執(zhí)行。每個(gè)整數(shù)流水線有可以在隊(duì)列中保存8條指令的保留站。通過(guò)一個(gè)6項(xiàng)的保留站,內(nèi)存操作也可以亂序進(jìn)行,而浮點(diǎn)與向量操作在自己的流水線內(nèi)不能重排。

13.2. 指令獲取與解碼

指令邊界在代碼緩存中標(biāo)記。這是消除自Pentium MMX以來(lái)Intel沒(méi)有使用的指令長(zhǎng)度解碼瓶頸的一個(gè)簡(jiǎn)單技術(shù),而AMD始終使用指令長(zhǎng)度解碼。

Silvermont有兩個(gè)解碼器,每時(shí)鐘周期可以獲取及解碼兩條簡(jiǎn)單指令。超過(guò)8字節(jié)的指令有每時(shí)鐘周期一條指令的吞吐率。大多數(shù)指令僅從解碼器產(chǎn)生一個(gè)μop。讀-修改及讀-修改-寫(xiě)指令從解碼器產(chǎn)生送往內(nèi)存單元與執(zhí)行單元的單個(gè)μop。產(chǎn)生多個(gè)μop的指令使用微代碼ROM,除了POP寄存器與FXCH指令。所有使用微代碼ROM的指令,如果去往解碼器0,需要4時(shí)鐘周期解碼。如果這樣一條指令首先去往解碼器1,那么在2時(shí)鐘周期的時(shí)延后,它被重定向到解碼器0。這意味著,對(duì)產(chǎn)生2個(gè)μop且恰好首先去往解碼器0的指令,解碼過(guò)程需要6時(shí)鐘周期。

帶有超過(guò)3個(gè)前綴及轉(zhuǎn)義字節(jié)的指令在解碼器中導(dǎo)致嚴(yán)重的時(shí)延。不像Intel與AMD的大多數(shù)其他處理器,Silvermont不僅包括這個(gè)限制里的標(biāo)準(zhǔn)前綴,還包括像0F這樣的轉(zhuǎn)義字節(jié)。因此,這個(gè)限制很容易超出。所有屬于SSSE3與更新指令集的xmm指令,在指令代碼中,有一個(gè)前綴字節(jié)(66)頁(yè)兩個(gè)轉(zhuǎn)義字節(jié)(0F 38或0F 3A)。如果任意r8 ~ r15或xmm8 ~ xmm15寄存器用在這樣一條指令里,那么需要一個(gè)額外的REX前綴,這樣就可以超過(guò)3個(gè)前綴與轉(zhuǎn)義字節(jié)的限制。例如:

; Example 13.1. Prefix limitation in Silvermont

pblendw xmm1, xmm2, 2 ; 1 prefix + 2 escape bytes

pblendw xmm1, xmm8, 2 ; 2 prefixes + 2 escape bytes

在這個(gè)例子中的第一條指令通常在一個(gè)時(shí)鐘周期里解碼,而第二條指令,如果首先去往第一個(gè)解碼器,需要4時(shí)鐘周期解碼,否則如果去往第二個(gè)解碼器,需要6時(shí)鐘周期。對(duì)長(zhǎng)度改變前綴沒(méi)有懲罰。

這兩個(gè)解碼器不能同時(shí)處理兩條分支指令。為此,應(yīng)該避免連續(xù)的分支指令。

13.3. 循環(huán)緩沖

Silvermont有一個(gè)回收已解碼μop的循環(huán)緩沖。通過(guò)消除解碼瓶頸,它可以提升最多29條指令循環(huán)的性能。

13.4. 宏操作融合

Silvermont不能將多條指令融合為單個(gè)μop。

13.5.?寄存器分配與亂序執(zhí)行

在通用寄存器上的指令可以有效程度地亂序執(zhí)行。顯然,同時(shí)不能掛起超過(guò)8條指令。在浮點(diǎn)與向量寄存器上的指令,與去往相同執(zhí)行端口及流水線的其他指令,不能一起亂序執(zhí)行。但在一個(gè)流水線里的浮點(diǎn)指令可以繞過(guò)另一個(gè)流水線里的浮點(diǎn)指令。例如,一條浮點(diǎn)乘法指令(在FP0)可以在之前一條浮點(diǎn)加法指令(在FP1)前面執(zhí)行。

相同的邏輯寄存器可以分配到不同的物理寄存器,以消除假的依賴。這也適用于浮點(diǎn)與向量寄存器,即使在相同的流水線中它們不能亂序執(zhí)行。

13.6. 無(wú)關(guān)的特殊情形

將一個(gè)寄存器置零的常用方式是與自己XOR或減去自身,比如XOR EAX, EAX。Silvermont處理器知道,如果兩個(gè)輸入操作數(shù)是同一個(gè)寄存器,某些指令與寄存器之前的值無(wú)關(guān)。這僅工作在幾個(gè)情形里。一個(gè)32位寄存器與自己的XOR被認(rèn)為與之前值無(wú)關(guān),但這不能作用于8,16或64位寄存器。因此,清理一個(gè)通用寄存器的最好方式是將該寄存器的32位版本與自身XOR。這將清除所有64位。SUB,SBB與CMP指令不能以這個(gè)方式察覺(jué)。一個(gè)向量寄存器可以通過(guò)PXOR,XORPS或XORPD指令,與自身XOR,清除對(duì)之前值的依賴,但不能通過(guò)減法、比較或其他指令。

13.7. 執(zhí)行單元

Silvermont有5個(gè)帶有自己調(diào)度器的執(zhí)行端口:

端口

操作

內(nèi)存

內(nèi)存讀寫(xiě)

整數(shù)端口0

ALU,乘法,偏移

整數(shù)端口1

ALU,跳轉(zhuǎn)

F.P.?端口0

乘法、除法、偏移、封裝、轉(zhuǎn)換

F.P.?端口1

加法

表13.1. Silvermont中的執(zhí)行單元

執(zhí)行單元是部分流水線化的。整數(shù)乘法器連同浮點(diǎn)加法器與乘法器,對(duì)較小的數(shù)據(jù),有每時(shí)鐘周期一條指令的吞吐率,對(duì)較大數(shù)據(jù),有每?jī)蓵r(shí)鐘周期一條指令的吞吐率:

端口與單元

數(shù)據(jù)大小

時(shí)延

吞吐率倒數(shù)

IP0乘法

32位整數(shù)

3

1

IP0乘法

64位整數(shù)

5

2

FP0乘法

4個(gè)16位整數(shù)組成的64位向量

4

1

FP0乘法

8個(gè)16位整數(shù)組成的128位向量

5

2

FP0乘法

單精度浮點(diǎn)

4

1

FP0乘法

4個(gè)單精度組成的128位向量

5

2

FP0乘法

雙精度

5

2

FP0乘法

2個(gè)雙精度組成的128位向量

7

4

FP0/1加法

8,16,32位整數(shù)組成的向量

1

0.5

FP0/1加法

64位整數(shù)組成的向量

4

?

FP1加法

單精度浮點(diǎn)

3

1

FP1加法

4個(gè)單精度浮點(diǎn)組成的128位向量

3

1

FP1加法

雙精度

3

1

FP1加法

2個(gè)雙精度組成的128位向量

4

2

表13.2. Silvermont中部分流水線化的執(zhí)行單元

在整數(shù)端口0與浮點(diǎn)端口0之間共享一個(gè)除法單元。它有19到69個(gè)時(shí)鐘周期的時(shí)延,沒(méi)有流水線化。浮點(diǎn)除法有固定的時(shí)延。

讀寫(xiě)帶寬

內(nèi)存帶寬是每時(shí)鐘周期一條128位讀或?qū)懼噶睢C繒r(shí)鐘周期進(jìn)行一次讀操作與一次寫(xiě)操作是可能的,但僅在這兩個(gè)操作是同一條指令的部分時(shí),如一條讀-修改-寫(xiě)指令。在所有其他情形中,最大帶寬是每時(shí)鐘周期一次內(nèi)存操作。

數(shù)據(jù)旁路時(shí)延

在整數(shù)單元與浮點(diǎn)/向量單元間移動(dòng)數(shù)據(jù)的指令有3 ~ 4個(gè)時(shí)鐘周期的時(shí)延。否則,在不同執(zhí)行單元間移動(dòng)數(shù)據(jù)沒(méi)有額外的時(shí)延。另外,在浮點(diǎn)數(shù)據(jù)上使用整數(shù)向量指令沒(méi)有懲罰,反之亦然。

下溢與次正規(guī)值

以次正規(guī)值作為輸入或輸出,或者產(chǎn)生下溢的操作,需要大約160個(gè)時(shí)鐘周期,除非同時(shí)使用flush-to-zero模式以及denormals-are-zero模式。

13.8. 部分寄存器訪問(wèn)

寫(xiě)部分寄存器對(duì)該寄存器余下部分有一個(gè)假的依賴。一個(gè)通用寄存器或向量寄存器的不同部分不視為彼此獨(dú)立。

標(biāo)記寄存器可處理為不同的部分。在寫(xiě)部分標(biāo)記寄存器后,讀任意標(biāo)記,有1時(shí)鐘周期的額外時(shí)延。

13.9. 緩存與內(nèi)存訪問(wèn)

緩存

Silvermont

1級(jí)代碼

每核32 kB,8路,64組,每行64 B

1級(jí)數(shù)據(jù)

每核24 kB,6路,64組,每行64 B,時(shí)延3

2級(jí)

1 MB,16路,1024組,每行64,時(shí)延19。線程間共享

表13.3. Silvermont上的緩存大小

沒(méi)有觀察到緩存庫(kù)沖突。在4kB倍數(shù)隔開(kāi)的內(nèi)存間有假的依賴。

13.10. 寫(xiě)轉(zhuǎn)發(fā)

一個(gè)內(nèi)存寫(xiě)可以轉(zhuǎn)發(fā)給后續(xù)一個(gè)在相同起始地址、相同大小或更小的讀。寫(xiě)+后續(xù)讀的時(shí)延是7時(shí)鐘周期。如果一個(gè)非對(duì)齊寫(xiě)轉(zhuǎn)發(fā)跨過(guò)緩存行邊界,有一個(gè)額外的3時(shí)鐘周期時(shí)延。

當(dāng)讀比寫(xiě)更大或者不在相同的地址開(kāi)始時(shí),寫(xiě)轉(zhuǎn)發(fā)失敗。將一個(gè)寫(xiě)轉(zhuǎn)發(fā)給兩個(gè)半部的讀是不可能的。一個(gè)失敗的寫(xiě)轉(zhuǎn)發(fā)有額外的5時(shí)鐘周期時(shí)延。

13.11. 多線程

Silvermont有一個(gè)或多個(gè)單元帶有2個(gè)核。一個(gè)單元里的這兩個(gè)核共享2級(jí)緩存。運(yùn)行在同一個(gè)單元里的兩個(gè)線程不會(huì)競(jìng)爭(zhēng)除了2級(jí)緩存以外的資源。

13.12. Silvermont里的瓶頸

指令獲取與解碼

解碼絕對(duì)是Silvermont設(shè)計(jì)中最弱的一環(huán)。產(chǎn)生多個(gè)μop的指令需要至少4時(shí)鐘周期解碼,很多時(shí)候需要更多時(shí)間(有少數(shù)例外)。這同樣適用于需要一個(gè)額外前綴的指令。所有屬于SSSE3及更新指令集的xmm指令需要4或6個(gè)時(shí)鐘周期解碼,如果它們使用了任意r8 ~ r15或xmm8 ~ xmm15寄存器。在對(duì)Silvermont的代碼設(shè)計(jì)里,應(yīng)該不惜一切代價(jià)避免在解碼器中需要額外時(shí)間的指令。

執(zhí)行端口與執(zhí)行單元

大多數(shù)執(zhí)行單元有完全的128位能力,但某些執(zhí)行單元僅部分流水線化,對(duì)完整的向量或雙精度數(shù)據(jù),需要額外的時(shí)鐘周期。

對(duì)小的低功耗處理器,執(zhí)行單元的能力看起來(lái)令人滿意。

Atom在遺留x87代碼上令人崩潰的性能,最終被修復(fù)。

亂序執(zhí)行

Silvermont有寄存器重命名,但對(duì)亂序執(zhí)行有非常有限的能力。對(duì)獲得最好性能,編譯器的調(diào)度可能是必要的。

分支預(yù)測(cè)

分支目標(biāo)緩沖的大小未知。預(yù)測(cè)率一般。誤預(yù)測(cè)懲罰相對(duì)低。根據(jù)我的測(cè)試,間接分支沒(méi)有模式預(yù)測(cè)。

內(nèi)存訪問(wèn)

吞吐率是每時(shí)鐘周期一個(gè)讀/寫(xiě)指令。緩存性能良好。

多線程

除了2級(jí)緩存,線程間不共享關(guān)鍵資源。這使得多線程高效。

文獻(xiàn)

Intel: "Intel 64 and IA-32 Architectures Optimization Reference Manual”. July 2013.

Sebastian Anthony: “Intel’s Silvermont revealed: After a five-year snooze, Intel is finally ready to crush?ARM”.?http://www.extremetech.com/computing/155082-intels-silvermont-revealed-after-a-five-year-snooze-intel-is-finally-ready-to-crush-arm. 2013.

Anand Lal Shimpi: “Intel’s Silvermont Architecture Revealed: Getting Serious about Mobile”.?http://www.anandtech.com/show/6936/intels-silvermont-architecture-revealed-getting-serious-about-mobile. 2013.

David Kanter: ”Silvermont, Intel’s Low Power Architecture”.?http://www.realworldtech.com/silvermont/. 2013.


【轉(zhuǎn)】Intel, AMD及VIA CPU的微架構(gòu)(32)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
措勤县| 仲巴县| 新密市| 廊坊市| 霍州市| 白沙| 邯郸县| 中西区| 育儿| 古田县| 阳山县| 威远县| 浏阳市| 西峡县| 新建县| 潼关县| 田阳县| 唐河县| 临海市| 大方县| 栾川县| 南汇区| 浦城县| 博爱县| 东丰县| 五大连池市| 乌鲁木齐市| 酉阳| 东安县| 洞头县| 寿宁县| 始兴县| 龙井市| 安庆市| 盱眙县| 博兴县| 元江| 定南县| 安阳市| 甘谷县| 和龙市|