国产精品天干天干,亚洲毛片在线,日韩gay小鲜肉啪啪18禁,女同Gay自慰喷水

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

借助 mperf 進(jìn)行矩陣乘法極致優(yōu)化

2023-03-29 11:34 作者:曠視天元MegEngine  | 我要投稿
作者:曠視 MegEngine 架構(gòu)師 洪超

前言

單精度矩陣乘法(SGEMM)是非常典型的計(jì)算密集型算子,對(duì) SGEMM 的優(yōu)化也經(jīng)常被當(dāng)作算子優(yōu)化從業(yè)人員的練手項(xiàng)目。本文將借助于 mperf,在 ARM A55 cpu 核心上對(duì) SGEMM 的性能進(jìn)行極致優(yōu)化,過程中會(huì)展示 mperf 輔助性能優(yōu)化工作的基本邏輯。希望本文的讀者對(duì)計(jì)算機(jī)體系結(jié)構(gòu)有一定了解,并且可以補(bǔ)充一些?TMA?的基礎(chǔ)概念。另外,關(guān)于本文使用的 mperf 工具,更多詳細(xì)介紹請(qǐng)參見之前的文章?mperf 介紹。

本文需要優(yōu)化的計(jì)算目標(biāo)是 C=AB,假設(shè)矩陣 A 大小為 MK,矩陣 B 大小為 KN,則得到矩陣 C 大小為 MN 。為了后文分塊操作的方便,這里假設(shè) M,N 是 4 的倍數(shù),并選擇 M=N=K 分別為 100,200,300,500,700,900 的矩陣尺寸,對(duì)不同優(yōu)化版本進(jìn)行性能測(cè)試。本文所有試驗(yàn)代碼均在?mperf/apps/cpu_pmu_analysis?目錄下。

矩陣乘法優(yōu)化

寄存器和 FPU 優(yōu)化——Naive 實(shí)現(xiàn)到循環(huán)展開

矩陣乘法的 Naive 實(shí)現(xiàn)為三層循環(huán)計(jì)算:

此時(shí),測(cè)試 M=N=K 分別為100,200,300 時(shí)的 mperf 性能數(shù)據(jù)見?Naive_mperf?, 關(guān)于這些測(cè)試數(shù)據(jù)的簡(jiǎn)單介紹請(qǐng)參見?mperf 測(cè)試數(shù)據(jù)。
測(cè)試命令(后文其他優(yōu)化版本的測(cè)試命令不再重復(fù)貼出):

從上面鏈接的 mperf 數(shù)據(jù)可以看到 Naive 實(shí)現(xiàn)的 GFLOPS 甚至不到 0.5,而 mperf 在 ARM A55 平臺(tái)實(shí)測(cè)的峰值浮點(diǎn)算力可以達(dá)到 14GFLOPs,顯然我們還有很長(zhǎng)的路要走。

分析 TMA Level-1 的數(shù)據(jù),也即比較 Frontend_Bound、Bad_Speculation、Backend_Bound 和 Retiring 的占比,可以發(fā)現(xiàn)占比最高的為 Backend_Bound,約為 50%,據(jù)此首先可以判斷 Naive 版本的性能瓶頸位于處理器后端。進(jìn)一步看 TMA Level-2 及以上級(jí)別的數(shù)據(jù),發(fā)現(xiàn) Backend_Bound 中占比最大的是?Core_Bound?,而?Interlock_Bound?又占 Core_Bound 的 95% 以上,緊接著?Interlock_FPU?又幾乎占 Interlock_Bound 的 100%。

由此可得,當(dāng)前的瓶頸在于 Interlock_FPU,Interlock_FPU 占比大說明浮點(diǎn)計(jì)算觸發(fā)了大量的 pipeline stall。除此之外,我們還觀察到?Metric_Neon_Port_Util?為 0,這是因?yàn)?Naive 版本沒有進(jìn)行向量計(jì)算。

關(guān)于如何降低 Interlock_FPU,我們?cè)缙诨?mperf 做過驗(yàn)證,證明 unroll 可以有效降低 Interlock_FPU,過程如下:

在這個(gè)例子中,分別對(duì)不進(jìn)行循環(huán)展開和以粒度為 2、5、10、20 的循環(huán)展開的fmla計(jì)算進(jìn)行測(cè)試,結(jié)果如下:

通過這個(gè)簡(jiǎn)單的例子我們可以看到,隨著循環(huán)展開粒度的增加,Interlock_FPU 會(huì)逐漸降低,并逐漸趨于穩(wěn)定。這是因?yàn)闆]有循環(huán)展開或循環(huán)展開特別小的時(shí)候,上一次循環(huán)還沒有執(zhí)行完成,下一次循環(huán)又要讀取相同的寄存器,進(jìn)而造成寄存器依賴。要消除寄存器依賴,首先要保證循環(huán)體中不同條指令使用不同的寄存器,并且盡量保證循環(huán)體內(nèi)指令的條數(shù)大于該指令的 latency 和該指令的 throughput 的乘積。以本文在 a55 平臺(tái)測(cè)試 fmla 向量計(jì)算為例,fmla的 latency 為 4 個(gè) cycle,并且 a55 處理器后端只有一個(gè) port 可以執(zhí)行 fmla 向量計(jì)算,也即 fmla 的 throughput 為 1,所以要求循環(huán)體 fmla 指令數(shù)大于 4 * 1 才可以解除寄存器依賴,這也符合上述試驗(yàn)結(jié)果的變化情況。

理解上面信息后,我們考慮在 Naive 版本上進(jìn)行循環(huán)展開,并依據(jù) Naive 版本 Metric_Neon_Port_Util 為 0,同時(shí)施加 SIMD 優(yōu)化。具體做法是,先對(duì)前面的行列采用 812 展開,對(duì)剩余的列采用 84 展開,再對(duì)剩余的行先采用 412 展開,最后用 44 展開,期間配合 ARM NEON 指令進(jìn)行向量化操作。

這里選擇 8*12 是為了更充分的利用寄存器資源,是因?yàn)?ARM A55 上面有 32 個(gè)128 bit 向量寄存器,以及考慮到本文最后 matmul 匯編版本的最內(nèi)層實(shí)現(xiàn)大體如下(注意這里使用的外積計(jì)算矩陣乘,具體參見外積算矩陣乘):

  • 從 A 矩陣讀 8 個(gè) float 到 2 個(gè)向量寄存器,此時(shí)應(yīng)該是 8 行里面每行的第一個(gè)數(shù)。

  • 從 B 矩陣讀 12個(gè)float 到 3 個(gè)向量寄存器,應(yīng)該是 12 列里每列的第一個(gè)數(shù)。

  • 用fmla指令,讓 B 的每個(gè) float 分別乘以A的兩個(gè)向量寄存器,產(chǎn)生 24 個(gè)向量結(jié)果,也全部存儲(chǔ)在寄存器中( 24 個(gè)向量寄存器存儲(chǔ) 8x12=96 個(gè)中間結(jié)果)。

采用 8*12 展開之后的代碼結(jié)構(gòu)如下:

關(guān)于循環(huán)展開,可以用一個(gè)圖來直觀地理解,這里 mr=8,nr=12,我們每次用 A 矩陣的 8 * K 的小塊和 B 矩陣的 K * 12 小塊來計(jì)算 C 的一個(gè) 8 * 12 小塊:

用 mperf 分析 unroll 版本的 matmul 實(shí)現(xiàn),具體數(shù)據(jù)見[ Unroll_mperf ] (https://www.megengine.org.cn/blog/mperf2#:~:text=Metric_GFLOPs_Use%20%3A%200.30557-,Unroll_mperf,-M%3DN%3DK)

對(duì)比 M,N,K 較小時(shí)(注: 在優(yōu)化寄存器和 FPU 單元利用率的時(shí)候可以把問題規(guī)模先限制得比較小,減少訪存相關(guān) issue 的干擾),Unroll 版本與 Naive 版本的 Interlock_FPU、Metric_Neon_Port_Util 和 GFLOPS:

可以看到循環(huán)展開后可以看到 Interlock_FPU 占比下降明顯,同時(shí) Metric_Neon_Port_Util 明顯上升,而 GFLOPS 指標(biāo)有了數(shù)量級(jí)的提高,說明充分利用寄存器資源和提高 FPU 利用率有效提高了程序性能。

訪存優(yōu)化——分塊和 PACK

上圖是 Unroll 版本與 Naive 版本在不同矩陣尺寸下的性能對(duì)比,可以看到循環(huán)展開在矩陣尺寸比較小的情況下,性能提升還是很明顯的,但是隨著矩陣尺寸增大 unroll 的效果迅速下降。所以現(xiàn)在我們將注意力轉(zhuǎn)移到,如何解決矩陣尺寸增大 GFLOPS 下降的問題。通過分析上節(jié)鏈接的 unroll 版本的 mperf 數(shù)據(jù),可以看到,隨著矩陣尺寸變大到一定程度,Memory_Bound 占比逐漸接近 50%,替代之前的 Interlock_FPU 成為新的性能瓶頸。而 Memory_Bound 占比高主要是?Load_Cache?造成的,這就指明了我們接下來需要進(jìn)行訪存相關(guān)的優(yōu)化。

分塊

之所以矩陣尺寸增加,unroll 版本的性能會(huì)下降,主要原因就是數(shù)據(jù)無法全部駐留在 Cache 中,導(dǎo)致數(shù)據(jù)頻繁地在 Cache 和主存之間換入換出,而處理器對(duì)主存的訪問是非常昂貴的。為了減少對(duì)主存的重復(fù)訪存,首先我們能想到的就是分塊( Unroll 版本中提到的分塊是內(nèi)層分塊,目的是優(yōu)化寄存器和 FPU 的利用率,請(qǐng)注意區(qū)分),將分塊之后的數(shù)據(jù)保存在 Cache 中,盡量使處理器發(fā)起的訪存操作都能命中 cache 中的數(shù)據(jù)。

這里我們選擇對(duì) N,K 維分別進(jìn)行 Nr 和 Kr 粒度的分塊,結(jié)合循環(huán)展開部分的邏輯,整體的分塊方式即為:外層選取 A 矩陣的 MKr 小塊和 B 矩陣的 KrNr 小塊,內(nèi)層再對(duì)這兩個(gè)小塊分別進(jìn)行 mr 行和 nr 列的劃分,所以最終內(nèi)層每次計(jì)算 mrKr 的 A 小塊和 Krnr 的 B 小塊,得到 C 矩陣 mr*nr 小塊的部分中間結(jié)果。

關(guān)于如何確定 Nr 和 Kr 的大小,我們的目標(biāo)就是使得計(jì)算時(shí)需要用到的分塊可以根據(jù)訪存頻繁的程度保存在 CPU 的各級(jí)存儲(chǔ)中,原則就是訪問越頻繁的分塊存儲(chǔ)在速度越快的存儲(chǔ)上,以及保證優(yōu)先用滿速度快的存儲(chǔ)資源之后再下溢。針對(duì) matmul, 具體約束條件設(shè)定為:

  • 將重復(fù)訪存率最高的 mr*nr 大小的 C 小塊保存在訪存速度最快的寄存器上(unroll 版本就是這樣假設(shè)的)。

  • 將下圖中紅色部分(包括計(jì)算完一個(gè) mrNr 的 C 行塊需要重復(fù)訪問次數(shù)最多的 mr?Kr 的 A 行塊,內(nèi)層一次計(jì)算迭代需要用到的 Kr*nr 大小的 B 列塊)都保存在 L1 中。

  • 由于計(jì)算完每一個(gè) mrNr 的 C 行塊,都需要重復(fù)遍歷一次整個(gè) KrNr 大小的 B 塊,因此希望將 KrNr 大小的 B 塊存放在 L2 中,使得每次讀取 Krnr 的 B 列塊的時(shí)候,都是從 L2 中讀取。

依據(jù)上面的分配策略,并結(jié)合 CPU 中的各級(jí)存儲(chǔ)資源(寄存器數(shù)量,L1D 和 L2 )的尺寸,便可以確定最佳的 Nr,Kr 取值:

  • 可以根據(jù) CPU 處理器的寄存器數(shù)量得到 mr 和 nr 的具體大小,寄存器容量>
    mr*nr (unroll 版本就是遵循這個(gè)約束條件取的 mr=8,nr=12)

  • 根據(jù) L1D Cache 的大小結(jié)合 mr 和 nr 計(jì)算出 Kr,Kr=L1D/(mr+nr)

  • 再根據(jù) L2 的大小計(jì)算出 B 矩陣中的 Nr,Nr=(L2-L1D)/Kr

在 ARM A55 上,最終得到的 Nr 為 252,Kr 為 256。注意:這里計(jì)算得到 Nr 為 256,但是由于我們選擇 nr 為 12,因此為了避免不必要的余數(shù)處理,選擇 Nr 為 12 的倍數(shù)簡(jiǎn)化問題。

Kr/Nr 分塊的代碼邏輯如下:

添加 Kr/Nr 分塊后的 mperf 性能數(shù)據(jù)見?Block_mperf

對(duì)比 Kr/Nr 分塊前后以下變化明顯的數(shù)據(jù):

Kr/Nr 分塊后可以看到在矩陣較大時(shí)進(jìn)行快速矩陣乘法,GFLOPS 確實(shí)上升不少,Load_Cache 和?Metric_L3D_RD_Miss_Ratio?等均有明顯下降。這說明 Kr/Nr分塊確實(shí)大幅減少了對(duì) latency 非常大的系統(tǒng)主存的訪問,優(yōu)化了程序的訪存性能。

數(shù)據(jù) PACK

分析 Kr/Nr 分塊后測(cè)得的 mperf 數(shù)據(jù),可以看到隨著矩陣尺寸變大,性能也能保持相對(duì)穩(wěn)定,沒有明顯下降。但是此時(shí) mperf 拿到的 TMA 指標(biāo)顯示, Backend_Bound 中的 Memory_Bound 占比依舊很高,性能瓶頸還是停留在訪存部分。

進(jìn)一步思考,在計(jì)算 mrnr 大小的 C 小塊的時(shí)候,每一次迭代都需要讀取 A 矩陣 mr1 的數(shù)據(jù),而本文測(cè)試的矩陣數(shù)據(jù)都是行主序,即不同行相同列的數(shù)據(jù)是內(nèi)存不連續(xù)的,訪存不連續(xù)就意味著對(duì) Cache 不友好。同樣在不同次迭代中,需要讀取矩陣 B 中不同行的 1*nr 小塊的數(shù)據(jù),自然也存在數(shù)據(jù)讀取不連續(xù)的情況??紤]到在分塊計(jì)算 matmul 的邏輯下,A 的所有行塊和 B 中的所有列塊將被讀取多次,因此可以通過對(duì) A 和 B 提前進(jìn)行數(shù)據(jù) PACK,這樣只在第一次 PACK 時(shí)候?qū)?Cache 不友好,而后面計(jì)算的時(shí)候多次訪問數(shù)據(jù)均為連續(xù)訪存,因此收益巨大。
下圖說明了對(duì) A/B 矩陣分別 PACK 的過程:

PACK 后的 mperf 性能數(shù)據(jù)見?Pack_mperf

對(duì)比 PACK 前后的數(shù)據(jù):

可以看到進(jìn)行 PACK 優(yōu)化后 GFLOPS 又有一定幅度的增長(zhǎng)。此時(shí)可以觀察到?L1D_TLB_Miss_Ratio?有所降低,并且在 M=N=K >= 700 時(shí)L2D_TLB_REFILL明顯降低,說明 PACK 確實(shí)可以通過減少缺頁的發(fā)生,減少 TLB miss,從而提升性能。

pipeline 優(yōu)化——嵌入?yún)R編

分析 PACK 之后的 mperf 數(shù)據(jù),可以發(fā)現(xiàn) Backend_Bound 占比 40% 以上,其中 Core_Bound 類別下的 Interlock_FPU 再次成為性能瓶頸?;叵?unroll 版本減少 Interlock_FPU 的思路,是通過循環(huán)展開給編譯器更大的優(yōu)化空間,讓編譯器充分利用寄存器來減少流水線依賴,但編譯器也是有局限的。一般來說,編譯器考慮到通用性,是很難生成針對(duì)特定處理器架構(gòu)特點(diǎn)的最優(yōu)匯編實(shí)現(xiàn)的( ARM in-order 架構(gòu)的小核上更是如此)。因此下一步的想法就是優(yōu)化編譯器生成的匯編,通過把內(nèi)層計(jì)算邏輯替換為嵌入式匯編,依據(jù)架構(gòu)特性調(diào)整指令選擇和指令排布,進(jìn)一步減少 pipeline 上的依賴和沖突,從而達(dá)成降低 Interlock_FPU 的目的。

首先,我們對(duì)比了 PACK 版本的 mperf 數(shù)據(jù)中的 FPU_util 和純算力測(cè)試情況下的 FPU_util,發(fā)現(xiàn) PACK 版本的 FPU_util 相對(duì)低了很多。也就是說,PACK 版本的 matmul 對(duì)處理器 SIMD 單元的利用率還是有一定提升空間的(下這個(gè)判斷的一個(gè)前提也是考慮到前文已經(jīng)對(duì) matmul 訪存部分優(yōu)化得很充分了,并且考慮到內(nèi)層循環(huán)中沒有分支判斷等復(fù)雜邏輯,只是比較存粹的訪存和計(jì)算指令的 interleave。換句話說,匯編優(yōu)化一般是留到最后進(jìn)行的)。

其次,我們注意到編譯器生成的匯編代碼中,數(shù)據(jù)加載使用的是 ldq 指令(ldq 指的是 armv8 isa 中 128bit load 操作),但是結(jié)合上面 FPU_util 數(shù)值比理想情況低的觀察(會(huì)關(guān)注 ldq 指令,是因?yàn)槲覀兞私獾?ARM A55 的訪存能力弱,一個(gè) cycle 最多 load 64bit,store 128bit),我們有理由懷疑 ldq 指令的選擇可能會(huì)造成 pipeline stall。通過查詢?ARM A55 trm?手冊(cè),我們發(fā)現(xiàn) ldq 在 a55 上需要兩個(gè) cycle 才能 issue 出去,并且 ldq 跟 fmla 不能雙發(fā)射(注: ARM A55 是雙發(fā)射架構(gòu)),這就證實(shí)了 ldq 會(huì)造成計(jì)算和訪存指令無法雙發(fā)射,并造成 Metric_FPU_util 數(shù)值的下降。進(jìn)一步,我們發(fā)現(xiàn) ldr,ldx,ins 三種指令都能與 fmla 雙發(fā)射,且發(fā)射周期都是 1 個(gè) cycle,而這三條指令可以組合出 ldq 等價(jià)的操作。因此,我們使用 ldr,ldx,ins 指令組合來替換 ldq 指令,就可以提高流水線的滿載程度,進(jìn)而提高性能。

我們用一個(gè)小的測(cè)試?yán)觼磉M(jìn)行驗(yàn)證: 考慮下面兩段代碼: 優(yōu)化前,使用 ldq 指令加載數(shù)據(jù),代碼如下:

我們對(duì)優(yōu)化前和優(yōu)化后的版本進(jìn)行測(cè)試,對(duì)分析 mperf 拿到的數(shù)據(jù),看到主要的變化為:

可以看到Metric_Load_Port_Util?和 Metric_GFLOPs_Use 均提升明顯,也就驗(yàn)證了前面的猜想。

因此,在嵌入的匯編代碼中,我們應(yīng)用上面提到的加載指令的替換,測(cè)得的 mperf 性能數(shù)據(jù)見:ASM_mperf

對(duì)比分析 PACK 和 ASM 兩個(gè)版本的 mperf 數(shù)據(jù),可以看到 Metric_Neon_Port_Util 和 Metric_Load_Port_Util 均顯著上升。

注意到完成匯編優(yōu)化后,在矩陣大小 M,N,K <= 300 時(shí),GFLOPS 性能已經(jīng)達(dá)到峰值算力的 90% 以上,基本上可以判定較小尺寸的情況下,matmul 在 ARM A55 平臺(tái)上已經(jīng)優(yōu)化到位了。而當(dāng) M,N,K 比較大時(shí),依舊有進(jìn)一步的優(yōu)化空間。但是考慮到本文的主要目的,是借助 matmul 優(yōu)化來說明 mperf 可以給性能優(yōu)化工作帶來哪些助益,所以就不繼續(xù)進(jìn)一步的優(yōu)化關(guān)工作了。

總結(jié)

本文以 ARM A55 平臺(tái)上的矩陣乘優(yōu)化為例,詳細(xì)介紹了如何用 mperf 分析當(dāng)前實(shí)現(xiàn)的性能表現(xiàn),找到性能瓶頸,進(jìn)而確定下一步的優(yōu)化方向,如此反復(fù)迭代,最終取得了接近硬件性能峰值的性能表現(xiàn)。本文各個(gè)版本 matmul 的性能對(duì)比,見下圖:

附錄

mperf測(cè)試數(shù)據(jù)

這里貼了不同優(yōu)化版本的 mperf 測(cè)試數(shù)據(jù),每一個(gè)版本下的測(cè)試數(shù)據(jù)都包含兩部分:一部分是非 Metric 前綴命名的,都是 TMA 范式下的指標(biāo);另一部分是 Metric 前綴命名的則是非 TMA 范式下,但是對(duì)性能優(yōu)化有輔助作用的指標(biāo)。這兩類指標(biāo)都是基于 PMU 原始 event 四則運(yùn)算加工得到的,具體的計(jì)算公式請(qǐng)參見?ARM a55 tma?。

另,TMA 范式下的指標(biāo)呈現(xiàn)多級(jí)展開的關(guān)系,由于當(dāng)前 mperf 未提供可視化工具,請(qǐng)參考下圖示意的層級(jí)關(guān)系進(jìn)行對(duì)號(hào)入座。并且,請(qǐng)注意附錄貼的 TMA 數(shù)值均為無量綱百分比。

Naive_mperf

Unroll_mperf

?

Block_mperf

Pack_mperf

ASM_mperf

術(shù)語表

  1. TMA: 也即 Top-down Microarchitecture Analysis 的縮寫。TMA 是 intel 工程師為分析 intel X86 cpu 微架構(gòu)的性能瓶頸而總結(jié)的方法論,可參見?intel x86 TMA?。一句話總結(jié)的話,TMA 就是一種在微架構(gòu)層面自頂而下的瓶頸定位方法。mperf 在 ARM cpu 上實(shí)現(xiàn)了 TMA 的方法論,并進(jìn)行了包括本文在內(nèi)的實(shí)踐驗(yàn)證。

  2. Core_Bound: This metric represents fraction of slots where Core non-memory issues were of a bottleneck. Shortage in hardware compute resources; or dependencies in software’s instructions are both categorized under Core Bound. 表示 CPU 處理器后端非訪存相關(guān)的 stall 引起的性能損失,通常包括 ALU 單元的資源不足,以及流水線上的指令依賴引起的 stall 等。

  3. Interlock_Bound: No operation issued due to the backend interlock. 表示 CPU 處理器后端因?yàn)榘l(fā)生了pipeline interlock而產(chǎn)生的 stall, pipeline interlock 就是 A 指令的執(zhí)行依賴 B 指令某一個(gè) pipeline stage 的結(jié)果,而 B 指令還沒有執(zhí)行到對(duì)應(yīng) stage,指令 A 就等 stall 等待依賴條件滿足,比如 raw 依賴??紤]到本文中頻繁出現(xiàn)關(guān)于處理器 pipeline 以及 pipeline interlock 相關(guān)的術(shù)語,如果讀者對(duì)這部分概念比較模糊,推薦一個(gè)很好的教學(xué)文檔?mips pipeline?。

  4. Interlock_FPU: No operation issued due to the backend, interlock, FPU. This event counts every cycle that issue is stalled and there is an interlock that is due to an FPU/NEON instruction. 這個(gè)指標(biāo)是上面 Interlock_Bound 的子類別,表征由 FPU/NEON 指令的 pipeline interlock 而產(chǎn)生流水線停頓的比例,比如前文降低 Interlock_FPU 的試驗(yàn)中,如果循環(huán)體中只有一個(gè)?fmla v0.4s, v0.4s, v0.4s?指令,下一個(gè)循環(huán) iter 的 fmla指令需要讀取 v0 的數(shù)值,這就依賴上一個(gè) iter 的 fmla 指令更新完 v0,而 fmla 指令的 latency 是多個(gè) cycle,也就造成了相鄰 iter 見 fmla 指令的 interlock, 流水線中將產(chǎn)生大量 stall。

  5. Load_Cache: No operation issued due to the backend, load, Cache miss. 表征因?yàn)镃ache讀延遲導(dǎo)致的stall。

  6. Metric_Neon_Port_Util: 處理器后端 neon port 的利用率,計(jì)算公式是ASE_SPEC/(CYCLES*NEON_PORTS),拿實(shí)際執(zhí)行的neon指令數(shù)除以處理器運(yùn)行的cycle和處理器后端支持neon操作的port端口數(shù)的乘積,ARM a55的NEON_PORTS是1,在這里用于表征處理器neon單元的利用率。

  7. Metric_L3D_RD_Miss_Ratio: L3 Cache讀的缺失率,計(jì)算公式是L3D_CACHE_REFILL_RD/L3D_CACHE_RD。

  8. Metric_Load_Port_Util: 處理器后端 load port 的利用率,計(jì)算公式是LD_SPEC/(CYCLES*LD_PORTS),拿實(shí)際執(zhí)行的load指令數(shù)除以處理器運(yùn)行的cycle數(shù)和處理器后端支持load操作的port端口數(shù)的乘積,ARM a55的LD_PORTS是1,在這里用于表征處理器LD單元的利用率。

  9. L1D_TLB_Miss_Ratio: 表征的是L1D的TLB miss的比例,L1D TLB miss會(huì)觸發(fā)L2D TLB的read。

  10. L2D_TLB_REFILL: 表征的是L2D的TLB miss的數(shù)量,會(huì)觸發(fā)昂貴的 page table walker。

更多 MegEngine 信息獲取,您可以:查看文檔:https://www.megengine.org.cn/doc/stable/zh/

GitHub 項(xiàng)目: https://github.com/MegEngine

加入 MegEngine 用戶交流 QQ 群:1029741705

歡迎參與 MegEngine 社區(qū)貢獻(xiàn),成為?Awesome MegEngineerhttps://www.megengine.org.cn/community-AMGE,榮譽(yù)證書、定制禮品享不停。


借助 mperf 進(jìn)行矩陣乘法極致優(yōu)化的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
石棉县| 萨迦县| 若羌县| 江阴市| 海安县| 阳春市| 韶关市| 仁寿县| 丹凤县| 永宁县| 墨竹工卡县| 广水市| 鄢陵县| 光山县| 厦门市| 桦川县| 萍乡市| 南靖县| 北宁市| 博兴县| 常山县| 武清区| 武定县| 即墨市| 西乌珠穆沁旗| 溆浦县| 南靖县| 彭州市| 昆山市| 民和| 壤塘县| 杭锦后旗| 淄博市| 南溪县| 玉树县| 正阳县| 专栏| 望奎县| 丽江市| 珲春市| 柳江县|