色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

編譯器優(yōu)化教程:寄存器分配 2

jf_78858299 ? 來源:畢昇編譯 ? 作者:王博洋 ? 2023-01-30 16:16 ? 次閱讀

線性掃描

接下來介紹一種不同思路的算法:線性掃描。算法描述如下[4]:

LinearScanRegisterAllocation:
	active := {}
	for i in live interval in order of increasing start point
		ExpireOldIntervals(i)
		if length(avtive) == R
			SpillAtInterval(i)
		else
			register[i] := a regsiter removed from pool of free registers
			add i to active, sorted by increasing end point
ExpireOldInterval(i)
	for interval j in active, in order of increaing end point
		if endpoint[j] >= startpoint[i]
			return
		remove j from active
		add register[j] to pool of free registers
SpillAtInterval(i)
	spill := last interval in active
	if endpoint[spill] > endpoint[i]
		register[i] := register[spill]
		location[spill] := new stack location
		remove spill from active
		add i to active, sorted by increasing end point
	else
		location[i] := new stack location

live interval其實就是變量的生命期,用活躍變量分析可以算出來。不過需要標(biāo)識第一次出現(xiàn)和最后一次出現(xiàn)的時間點。

舉個例子:

圖片

圖10

變量名 live interval
a 1,2
d 2,3,4,5
e 3,4,5,6

llvm中實現(xiàn)

在上文中介紹的算法都是作用在最普通的四元式上,但LLVM-IR是SSA形式,有PHI節(jié)點,但PHI節(jié)點沒有機(jī)器指令表示,所以在寄存器分配前需要把PHI節(jié)點干掉,消除PHI節(jié)點的算法限于篇幅不展開,如感興趣的話請后臺留言。

llvm作為工業(yè)級編譯器,有多種分配算法,可以通過llc的命令行選項-regalloc=pbqp|greedy|basic|fast來手動控制分配算法。

不同優(yōu)化等級默認(rèn)使用算法也不同:O2和O3默認(rèn)使用greedy,其他默認(rèn)使用fast。

fast算法的策略很簡單,掃描代碼并為出現(xiàn)的變量分配寄存器,寄存器不夠用就溢出到內(nèi)存。用途主要是 調(diào)試

basic算法以linearscan為基礎(chǔ)并對life interval設(shè)置了溢出權(quán)重而且用優(yōu)先隊列來存儲life interval。

greedy算法也使用優(yōu)先隊列,但特點是先為生命期長的變量分配寄存器,而短生命期的變量可以放在間隙中,詳情可以參考[5]。

pbqp算法全稱是Partitioned Boolean Quadratic Programming,限于篇幅,感興趣的讀者請查閱[6]。

至于具體實現(xiàn),自頂向下依次是:

  • TargetPassConfig::addMachinePasses含有寄存器分配和其他優(yōu)化
  • addOptimizedRegAlloc中是與寄存器分配密切相關(guān)的pass,比如上文提到的消除PHI節(jié)點
  • addRegAssignAndRewriteOptimized是實際的寄存器分配算法
  • 寄存器分配相關(guān)文件在lib/CodeGen下的RegAllocBase.cpp、RegAllocGreedy.cpp、RegAllocFast.cpp、RegAllocBasic.cpp和RegAllocPBQP.cpp等。
  • RegAllocBase類定義了一系列接口,重點是selectOrSplit和enqueue/dequeue方法,數(shù)據(jù)結(jié)構(gòu)的重點是priority queue。selectOrSplit方法可以類比上文中提到的SpillAtInterval。priority queue類比active list。簡要代碼如下:
void RegAllocBase::allocatePhysRegs() {
  // 1. virtual reg其實就是變量
  while (LiveInterval *VirtReg = dequeue()) {

    // 2.selectOrSplit 會返回一個可用的物理寄存器然后返回新的live intervals列表
    using VirtRegVec = SmallVector4>;
    VirtRegVec SplitVRegs;
    MCRegister AvailablePhysReg = selectOrSplit(*VirtReg, SplitVRegs);
 // 3.分配失敗檢查
    if (AvailablePhysReg == ~0u) {
     ...
    }
 // 4.正式分配
    if (AvailablePhysReg)
      Matrix->assign(*VirtReg, AvailablePhysReg);
 
    for (Register Reg : SplitVRegs) {
      // 5.入隊分割后的liver interval
      LiveInterval *SplitVirtReg = &LIS->getInterval(Reg);
      enqueue(SplitVirtReg);
    }
  }
}

至于這四種算法的性能對比,我們主要考慮三個指標(biāo):運行時間、編譯時間和溢出次數(shù)。

圖片

圖11 各算法的運行時間,圖源[6]

橫坐標(biāo)是測試集,縱坐標(biāo)是以秒為單位的運行時間

圖片

圖12 各算法的編譯時間,圖源[6]

橫坐標(biāo)是測試集,縱坐標(biāo)是編譯時間

圖片

圖13 各算法的溢出次數(shù),圖源[6]

從這三幅圖可以看出greedy算法在大多數(shù)測試集上都優(yōu)于其他算法,因此greedy作為默認(rèn)分配器是可行的。

小結(jié)

我們通過一個例子介紹了活躍變量分析和圖著色算法。借助活躍變量分析,我們知道了變量的生命期,有了變量生命期建立干涉圖,對干涉圖進(jìn)行著色。如果著色失敗,可以選擇某個變量溢出到內(nèi)存中。之后在RIG的基礎(chǔ)上介紹了寄存器合并這一變換。

然后我們簡單介紹了不同思路的寄存器分配算法:linearscan。最后介紹了llvm12中算法的實現(xiàn)并對比了llvm中四種算法的性能差異。

參考

  1. http://www.cs.cmu.edu/afs/cs.cmu.edu/academic/class/15745-s18/www/lectures/L5-Intro-to-Dataflow-pre-class.pdf
  2. http://web.cecs.pdx.edu/~mperkows/temp/register-allocation.pdf
  3. http://www.cs.cmu.edu/afs/cs.cmu.edu/academic/class/15745-s18/www/lectures/L12-Register-Allocation.pdf http://www.cs.cmu.edu/afs/cs.cmu.edu/academic/class/15745-s18/www/lectures/L13-Register-Coalescing.pdf
  4. http://web.cs.ucla.edu/~palsberg/course/cs132/linearscan.pdf
  5. http://blog.llvm.org/2011/09/greedy-register-allocation-in-llvm-30.html
  6. T. C. d. S. Xavier, G. S. Oliveira, E. D. d. Lima and A. F. d. Silva, "A Detailed Analysis of the LLVM's Register Allocators," 2012 31st International Conference of the Chilean Computer Science Society, 2012, pp. 190-198, doi: 10.1109/SCCC.2012.29.
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5363

    瀏覽量

    120919
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4820

    瀏覽量

    68881
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1642

    瀏覽量

    49229
收藏 人收藏

    評論

    相關(guān)推薦

    編譯器優(yōu)化那些事兒(5):寄存器分配

    編譯器,有多種分配算法,可以通過llc的命令行選項-regalloc=pbqp|greedy|basic|fast來手動控制分配算法。不同優(yōu)化等級默認(rèn)使用算法也不同:O
    發(fā)表于 08-24 14:41

    編譯器優(yōu)化的靜態(tài)調(diào)度介紹

    約束條件進(jìn)行聯(lián)合求解得到的解決方案是相對更優(yōu)的,但由于無論是指令調(diào)度還是寄存器分配,都是很復(fù)雜的NP完全問題,綜合考慮下,編譯器一般會分別處理二者。  在LLVM編譯器的設(shè)計中,
    發(fā)表于 03-17 17:07

    寄存器組網(wǎng)絡(luò)處理上的寄存器分配技術(shù)

    本內(nèi)容提供了多寄存器組網(wǎng)絡(luò)處理上的寄存器分配技術(shù)
    發(fā)表于 06-28 15:26 ?28次下載
    多<b class='flag-5'>寄存器</b>組網(wǎng)絡(luò)處理<b class='flag-5'>器</b>上的<b class='flag-5'>寄存器</b><b class='flag-5'>分配</b>技術(shù)

    編譯器_keil的優(yōu)化選項問題

    keil編譯器優(yōu)化選項針對ARM,對STM32編譯的一些優(yōu)化的問題
    發(fā)表于 02-25 14:18 ?3次下載

    高效的C編程之寄存器分配

    14.7 寄存器分配 編譯器一項很重要的優(yōu)化功能就是對寄存器分配。與
    發(fā)表于 10-17 17:17 ?4次下載

    C編譯器及其優(yōu)化

    本章將幫助讀者在ARM處理上編寫高效的C代碼。本章涉及的一些技術(shù)不僅適用于ARM處理,也適用于其他RISC處理。本章首先從ARM編譯器及其優(yōu)化
    發(fā)表于 10-17 17:22 ?2次下載

    靜態(tài)變量、自動變量與寄存器變量的存儲

    register限定詞通知編譯器--程序中的變量將頻繁使用。它的意思是建議編譯器將程序中用register限定的變量放置在計算機(jī)的內(nèi)部寄存其中,這樣可能得到更小更快的程序。但是,編譯器
    發(fā)表于 06-03 11:27 ?3248次閱讀
    靜態(tài)變量、自動變量與<b class='flag-5'>寄存器</b>變量的存儲

    編譯器優(yōu)化對函數(shù)的影響

    編譯器如gcc,可以指定不同的優(yōu)化參數(shù),在某些條件下,有些函數(shù)可能會被優(yōu)化掉。
    的頭像 發(fā)表于 06-22 14:58 ?2863次閱讀
    <b class='flag-5'>編譯器</b><b class='flag-5'>優(yōu)化</b>對函數(shù)的影響

    基于C++編譯器的節(jié)點融合優(yōu)化方法

    節(jié)點,減少諸如指令、寄存器、時鐘周期和訪存等開銷,以達(dá)到減少程序運行時間,提升訪存效率等目的。為了提升LLVM編譯器的性能,文中在LLVM編譯流程的中間表示階段和DAG合并階段、指令選擇階段提岀了節(jié)點融合
    發(fā)表于 06-15 14:29 ?19次下載

    什么是編譯器算法之寄存器分配

    寄存器是CPU中的稀有資源,如何高效的分配這一資源是一個至關(guān)重要的問題。本文介紹了基于圖著色的寄存器分配算法。
    的頭像 發(fā)表于 03-02 16:11 ?1194次閱讀
    什么是<b class='flag-5'>編譯器</b>算法之<b class='flag-5'>寄存器</b><b class='flag-5'>分配</b>

    怎么給D寄存器輸入數(shù)值 三菱plc寄存器D怎么讀取

    在單片機(jī)編程中,給D寄存器輸入數(shù)值的方法取決于所使用的編程語言和編譯器
    發(fā)表于 04-12 13:33 ?1.8w次閱讀

    編譯器優(yōu)化選項

    一個程序首先要保證正確性,在保證正確性的基礎(chǔ)上,性能也是一個重要的考量。要編寫高性能的程序,第一,必須選擇合適的算法和數(shù)據(jù)結(jié)構(gòu);第二,應(yīng)該編寫編譯器能夠有效優(yōu)化以轉(zhuǎn)換成高效可執(zhí)行代碼的源代碼,要做到
    的頭像 發(fā)表于 11-24 15:37 ?944次閱讀
    <b class='flag-5'>編譯器</b>的<b class='flag-5'>優(yōu)化</b>選項

    Keil編譯器優(yōu)化方法

    我們都知道,代碼是可以通過編譯器優(yōu)化的,有的時候,為了提高運行速度或者減少代碼尺寸,會開啟優(yōu)化選項。
    的頭像 發(fā)表于 10-23 16:35 ?758次閱讀
    Keil<b class='flag-5'>編譯器</b><b class='flag-5'>優(yōu)化</b>方法

    Triton編譯器與其他編譯器的比較

    Triton編譯器與其他編譯器的比較主要體現(xiàn)在以下幾個方面: 一、定位與目標(biāo) Triton編譯器 : 定位:專注于深度學(xué)習(xí)中最核心、最耗時的張量運算的優(yōu)化。 目標(biāo):提供一個高度抽象、靈
    的頭像 發(fā)表于 12-24 17:25 ?444次閱讀

    Triton編譯器優(yōu)化技巧

    在現(xiàn)代計算環(huán)境中,編譯器的性能對于軟件的運行效率至關(guān)重要。Triton 編譯器作為一個先進(jìn)的編譯器框架,提供了一系列的優(yōu)化技術(shù),以確保生成的代碼既高效又適應(yīng)不同的硬件架構(gòu)。 1. 指令
    的頭像 發(fā)表于 12-25 09:09 ?301次閱讀
    主站蜘蛛池模板: 亚洲日本一区二区三区在线不卡| 丰满的寡妇hd高清在线观看| 51国产偷自视频在线视频播放| 99精品国产在热久久| 电影日本妻子| 久草在线在线精品观看| 男人的天堂黄色| 无限资源网免费看| 最新黄色在线| 成人免费精品视频| 精品午夜寂寞影院在线观看| 欧美国产在线一区| 亚州日韩精品AV片无码中文| 2021精品乱码多人收藏| 国产高清在线a视频大全| 久久精品亚洲牛牛影视| 青草在线在线d青草在线| 国产AV午夜精品一区二区入口| 果冻传媒色AV国产播放| 男子扒开美女尿口做羞羞的事| 天天综合亚洲综合网站| 真人做受120分钟免费看| 国产69精品久久久熟女| 久久青青草原| 玩弄朋友娇妻呻吟交换电影| 中文字幕在线观看亚洲视频| 国产成人啪精品视频免费网| 恋孩癖网站大全在线观看| 首页_亚洲AV色老汉影院| 中文字幕在线观看亚洲| 国产美女一区二区| 欧美卡1卡2卡三卡2021精品| 亚洲视频精品| 国产成人h在线视频| 美女坐脸vk| 亚洲精品一二三| 动漫美女人物被黄漫在线看| 乱xxxjapanese黑人| 亚洲精品不卡视频| 高清午夜福利电影在线| 女配穿书病娇被强啪h|