飛騰CPU體系結構(十一)

2021-10-25 08:54:46 字數 3375 閱讀 8043

飛騰cpu為了提公升效能,支援從外部記憶體中預取資料到l1或l2快取中。如果某個快取塊內容不在l1/l2快取中,當該快取塊的某個位址單元被第一訪問時,就會遇到記憶體牆,即飛騰cpu會從記憶體中將整個快取塊內容傳輸到快取中。軟體不能直接感知這種預取機制,但記憶體牆會導致第一次訪問該快取塊的訪存指令延遲比較大。

飛騰cpu還提供專門的預取指令prfm,用於第一次訪問新資料之前就提前通知快取去記憶體預取相關快取塊內容,來避免記憶體牆延遲。

需要注意的是,這種預取指令prfm只能用於系統主存型別,不能用於外設記憶體型別

除了資料位址之外,預取指令prfm還指定了型別,目標和策略三種基本引數。

引數說明

型別pid

為了load預期

pst為了store預期

目標l1

l1級快取

l2l2級快取

策略keep

常規快取策略

strm

流資料快取策略

舉個列子

指令說明

prfm pldl1keep [x0]

將快取塊從記憶體預讀到l1快取中,並會在讀訪問完成後,還會儲存一段時間

prfm pldl2strm [x0]

將快取塊從記憶體預讀到l1快取中,並會在讀訪問完成後,不久就失效了

不能想當然地認為,預取就是一定會優化,預期有時候不一定會有優化效果,使用不當還會造成效能損失。

x0目標虛擬位址

x1源虛擬位址

預設引數為頁長度引數,page_size

先處理從源的第乙個128位元組的讀

最後處理到目標的最後128位元組寫

entry(copy_page)

第一部分:先處理從源的第乙個128位元組的讀

函式一開始就預取第二個、第三個和第四個128位元組,如果cpu硬體不支援預取指令,就用nop指令取代。

alternative_if arm64_has_no_hw_prefetch

prfm pldl1strm, [x1, #128]

prfm pldl1strm, [x1, #256]

prfm pldl1strm, [x1, #384]

alternative_else_nop_endif

第乙個128位元組的讀取,這128位元組沒有必要預取,如果預取第乙個128位元組,效能不公升反而下降

ldp x2, x3, [x1]

ldp x4, x5, [x1, #16]

ldp x6, x7, [x1, #32]

ldp x8, x9, [x1, #48]

ldp x10, x11, [x1, #64]

ldp x12, x13, [x1, #80]

ldp x14, x15, [x1, #96]

ldp x16, x17, [x1, #112]

/*x18用於記錄還剩的位元組數量*/

mov x18, #(page_size - 128)

add x1, x1, #128

這部分是迴圈的主體部分

1:

subs x18, x18, #128

alternative_if arm64_has_no_hw_prefetch

prfm pldl1strm, [x1, #384]/此處的預取資料為3個128位元組之後的資料了/

alternative_else_nop_endif

stnp x2, x3, [x0]/先寫,這屬於上乙個128位元組內的範圍/

ldp x2, x3, [x1]/後讀,這屬於下乙個128位元組內的範圍/

stnp x4, x5, [x0, #16]

ldp x4, x5, [x1, #16]

stnp x6, x7, [x0, #32]

ldp x6, x7, [x1, #32]

stnp x8, x9, [x0, #48]

ldp x8, x9, [x1, #48]

stnp x10, x11, [x0, #64]

ldp x10, x11, [x1, #64]

stnp x12, x13, [x0, #80]

ldp x12, x13, [x1, #80]

stnp x14, x15, [x0, #96]

ldp x14, x15, [x1, #96]

stnp x16, x17, [x0, #112]

ldp x16, x17, [x1, #112]

add x0, x0, #128

add x1, x1, #128

b.gt 1b/跳轉到標籤1處/

最後第三部分:處理到目標的最後128位元組寫

完成後函式返回

stnp x2, x3, [x0]

stnp x4, x5, [x0, #16]

stnp x6, x7, [x0, #32]

stnp x8, x9, [x0, #48]

stnp x10, x11, [x0, #64]

stnp x12, x13, [x0, #80]

stnp x14, x15, [x0, #96]

stnp x16, x17, [x0, #112]

ret

endproc(copy_page)

飛騰CPU體系結構(九)

向量訪存指令主要包括ld1 st1 ld2 st2 ld3 st3和ld4 st4四種。ld1 st1一般針對乙個向量暫存器,也有兩個 三個或四個向量暫存器的模式。ld2 st2僅僅針對兩個向量暫存器 ld3 st3僅僅針對三個向量暫存器 ld4 st4僅僅針對四個向量暫存器 下面具體列出四種操作方...

CPU各種體系結構

本貼 http hi.baidu.com shentuhongfeng blog item 2d9bb01fdd4fedf9e0fe0b8d.html cpu體系結構的選定也決定了其他硬體的選擇。不同的cpu需要不同的主機板,主機板決定了所能選擇的儲存器和您要使用的插卡 plug in card 1...

CPU體系結構介紹

cpu體系結構的選定也決定了其他硬體的選擇。不同的cpu需要不同的主機板,主機板決定了所能選擇的儲存器和您要使用的插卡 plug in card 1.cisc複雜指令集電腦 complex instruction set computer.risc精簡指令集電腦 reduced instructio...