<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          MegPeak——讓你更懂你的處理器

          共 2813字,需瀏覽 6分鐘

           ·

          2022-08-09 09:38


          在算力需求爆炸的大背景下,如何發(fā)揮出已有硬件的最大算力變得非常重要,直觀一點(diǎn)是:我們需要對(duì)現(xiàn)有算法針對(duì)特定的處理器進(jìn)行極致的性能優(yōu)化,盡量滿足目前AI算法對(duì)算力的高要求。


          為了能夠做到極致的性能優(yōu)化,我們可能的方向有:

          • 優(yōu)化算法,使得算法能夠在滿足準(zhǔn)確度前提下,訪存和計(jì)算量盡量小

          • 優(yōu)化程序,使得實(shí)現(xiàn)這些算法的程序最大限度發(fā)揮處理器性能

          在優(yōu)化程序的過(guò)程中,首先要解決的問(wèn)題是:如何評(píng)估程序發(fā)揮了處理器幾成的算力,以及進(jìn)一步優(yōu)化空間和優(yōu)化方向。


          為了更懂我們的處理器,曠視MegEngine 團(tuán)隊(duì)開發(fā)了一個(gè)工具MegPeak,可以幫助開發(fā)人員進(jìn)行性能評(píng)估,開發(fā)指導(dǎo)等,目前已經(jīng)開源。

          GitHub項(xiàng)目地址:https://github.com/MegEngine/MegPeak。

          點(diǎn)擊文末的閱讀原文,可了解更多MegPeak的使用方法、原理等


          MegPeak功能


          通過(guò) MegPeak ,用戶可以測(cè)試目標(biāo)處理器:

          • 指令的峰值帶寬

          • 指令延遲

          • 內(nèi)存峰值帶寬

          • 任意指令組合峰值帶寬

          雖然上面的部分信息可以通過(guò)芯片的數(shù)據(jù)手冊(cè)查詢相關(guān)數(shù)據(jù),然后結(jié)合理論計(jì)算得到,但是很多情況下無(wú)法獲取目標(biāo)處理器詳盡的性能文檔,另外通過(guò) MegPeak 進(jìn)行測(cè)量更直接和準(zhǔn)確,并且可以測(cè)試特定指令組合的峰值帶寬。MegEngine團(tuán)隊(duì)使用MegPeak在幾種常用ARM架構(gòu)CPU上進(jìn)行測(cè)試,根據(jù)對(duì)指令fmla的測(cè)試結(jié)果整理出下表。



          其中,GFLOPS指標(biāo)可以衡量設(shè)備的算力,而 FLOPS/Cycle指標(biāo)可以幫助推測(cè)CPU的硬件特征。下面以A55/A77/Apple M1分別舉例說(shuō)明。

          • A55:由于每條指令fmla可執(zhí)行兩次浮點(diǎn)運(yùn)算(包括一次乘法和一次加法),且測(cè)試得到的FLOPS/Cycle指標(biāo)接近8,故可以推測(cè)A55的后端執(zhí)行單元有一個(gè)128位浮點(diǎn)向量乘加單元或有兩個(gè)64位浮點(diǎn)向量乘加單元。

          • A77:其FLOPS/Cycle指標(biāo)約為16,所以每個(gè)周期A77可以執(zhí)行2條SIMD的fmla指令,所以其后端有兩個(gè)SIMD fmla執(zhí)行單元,且后端至少是雙發(fā)射的。

          • Apple M1:Apple M1的FLOPS/Cycle指標(biāo)達(dá)到了32,說(shuō)明其擁有4個(gè)SIMD執(zhí)行單元

          用 MegPeak 測(cè)到的數(shù)據(jù),可以用來(lái)干什么

          MegPeak可以測(cè)試出處理器的內(nèi)存帶寬,指令的理論計(jì)算峰值,指令的延遲等信息,因此可以幫助我們:

          • 繪制 Roofline Model 指導(dǎo)我們優(yōu)化模型性能

          • 評(píng)估程序的優(yōu)化空間

          • 探索指令組合的理論計(jì)算峰值

          另外MegPeak還可以提供對(duì)理論的驗(yàn)證,如我們通過(guò)處理器頻率*單核單周期指令發(fā)射數(shù)量*每條指令執(zhí)行的計(jì)算量可以計(jì)算出理論計(jì)算峰值,然后我們可以通過(guò)MegPeak進(jìn)行實(shí)際測(cè)量進(jìn)行驗(yàn)證。


          繪制指令相關(guān)的 Roofline Model



          Roofline 模型被大量的使用在高性能計(jì)算中,是評(píng)估算法的可優(yōu)化程度和優(yōu)化方向的重要工具。使用 MegPeak 可以繪制出更加具體的關(guān)于指令對(duì)應(yīng)的Roofline模型,如:在CPU中,不同的數(shù)據(jù)類型,雖然訪存帶寬不會(huì)改變,但是計(jì)算峰值差距比較大,比如在arm上 float 的計(jì)算峰值和 int8 的計(jì)算峰值差距很大。


          評(píng)估代碼優(yōu)化空間

          在優(yōu)化具體算法的時(shí)候,可以通過(guò)MegPeak測(cè)試出kernel里面的主要指令的最大峰值,如在Arm上優(yōu)化 fp32 Matmul 的時(shí)候,主要用到的指令是 fmla 指令,這時(shí)候可以測(cè)試程序?qū)嶋H運(yùn)行的峰值,指令的峰值和程序的峰值差距越小,說(shuō)明代碼優(yōu)化的越好。


          另外,可以根據(jù)算法實(shí)現(xiàn)計(jì)算出計(jì)算量和訪存量,并使用MegPeak繪制出上面的Roofline,通過(guò)計(jì)算實(shí)際的計(jì)算密度,然后再對(duì)應(yīng)到Roofline中,如果計(jì)算密度落在上圖中的綠色區(qū)域,說(shuō)明程序需要更多考慮優(yōu)化訪存,提供更優(yōu)的訪存模型,如分塊,提前pack數(shù)據(jù)等。如果計(jì)算強(qiáng)度的點(diǎn)落在灰色區(qū)域說(shuō)明,代碼已經(jīng)最優(yōu)了,如果還想進(jìn)一步提速,只能考慮從算法角度進(jìn)行優(yōu)化了,如:在卷積中使用FFTWinograd等算法進(jìn)行優(yōu)化。


          探索最優(yōu)指令組合

          很多Kernel的優(yōu)化不是單純的某一條指令就可以衡量,可能需要多條指令的組合才能代表整個(gè)Kernel的計(jì)算,因此我們需要探索如何組織這些指令使其達(dá)到處理器最優(yōu)的性能。下面列舉在A53小核優(yōu)化fp32 Matmul的過(guò)程中,由于Matmul是計(jì)算密集型算子, 考慮通過(guò)多發(fā)射隱藏訪存指令的開銷,使用 MegPeak 配合進(jìn)行分析,探索如何組合指令實(shí)現(xiàn)盡可能多的多發(fā)射。


          因?yàn)樾『松厦尜Y源有限,指令多發(fā)射有很多限制:

          • 首先使用MegPeak測(cè)試出 A53 上 fp32 的 fmla 指令的計(jì)算峰值,將其定義為100%峰值計(jì)算性能

          • 測(cè)試哪些指令組合可以支持雙發(fā)射

          • 在MegPeak中添加vector load 和 fmla 1:1組合的代碼,然后測(cè)試其峰值僅僅為float峰值的36%,表明Vector load和 fmla不能雙發(fā)射

          • 同樣可以測(cè)得通用寄存器load指令ldr+fmla的組合可以達(dá)到float峰值的93%,說(shuō)明 ldr 可以和 fmla雙發(fā)射

          • 同上可以測(cè)得 ins+fmla 能雙發(fā)射,ins + vector load 64位 可以雙發(fā)射

          • 根據(jù)Matmul最內(nèi)層Kernel的計(jì)算原理,如最內(nèi)層Kernel的分塊大小是8x12,那最內(nèi)層需要讀取:20個(gè)float數(shù)據(jù),計(jì)算24次fmla計(jì)算

          • 結(jié)合上面的 MegPeak 測(cè)試的信息,我們需要找到用最少時(shí)鐘完成這20個(gè)float數(shù)據(jù)load,和24次fmla數(shù)據(jù)計(jì)算的指令組合,因此需要將盡可能多的數(shù)據(jù)load和fmla進(jìn)行雙發(fā)射,隱藏?cái)?shù)據(jù)load的耗時(shí)

          • 最后的指令組合是:

          • 使用vector load 64指令 + ldr + ins組合成為一個(gè)neon寄存器數(shù)據(jù),因?yàn)閘dr和ins都可以和fmla雙發(fā)射,把他們和fmla放在一起可以隱藏他們的耗時(shí)

          • 在這3條指令中穿插fmla指令,并盡可能解決數(shù)據(jù)依賴

          根據(jù)上面的指令組合可以使得Matmul在小核上達(dá)到計(jì)算峰值的70%左右。


          總結(jié)

          MegPeak 作為一個(gè)進(jìn)行高性能計(jì)算的輔助工具,能夠使得開發(fā)人員輕松獲得目標(biāo)處理器的內(nèi)在的詳細(xì)信息,輔助進(jìn)行對(duì)代碼的性能評(píng)估,以及優(yōu)化方法設(shè)計(jì)。但是MegPeak也有一些需要豐富的方向:

          • 支持獲取更多的處理器性能數(shù)據(jù),如:L1,L2 cache的大小,自動(dòng)探索各種指令組合的雙發(fā)射情況,并大概繪制出一個(gè)處理器后端的縮略圖。如:https://en.wikichip.org/w/images/5/57/cortex-a76_block_diagram.svg

          • 支持測(cè)量移動(dòng)端OpenCL的更多細(xì)節(jié)信息,如:warp size,local memory 大小等。


          如果有同學(xué)對(duì)上面的功能感興趣,歡迎大家提交代碼。最后歡迎大家使用 MegPeak。

          瀏覽 40
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  成人午夜无码影院 | 久久婷婷五月综合伊人 | 学生妹一级片,黄色的学生妹一级片 | 午夜AV在线 | 大香蕉AV永久在线 |