女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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

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

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

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

jf_78858299 ? 來(lái)源:畢昇編譯 ? 作者:王博洋 ? 2023-01-30 16:16 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

線性掃描

接下來(lái)介紹一種不同思路的算法:線性掃描。算法描述如下[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其實(shí)就是變量的生命期,用活躍變量分析可以算出來(lái)。不過(guò)需要標(biāo)識(shí)第一次出現(xiàn)和最后一次出現(xiàn)的時(shí)間點(diǎn)。

舉個(gè)例子:

圖片

圖10

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

llvm中實(shí)現(xiàn)

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

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

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

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

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

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

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

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

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

    // 2.selectOrSplit 會(huì)返回一個(gè)可用的物理寄存器然后返回新的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.入隊(duì)分割后的liver interval
      LiveInterval *SplitVirtReg = &LIS->getInterval(Reg);
      enqueue(SplitVirtReg);
    }
  }
}

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

圖片

圖11 各算法的運(yùn)行時(shí)間,圖源[6]

橫坐標(biāo)是測(cè)試集,縱坐標(biāo)是以秒為單位的運(yùn)行時(shí)間

圖片

圖12 各算法的編譯時(shí)間,圖源[6]

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

圖片

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

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

小結(jié)

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

然后我們簡(jiǎn)單介紹了不同思路的寄存器分配算法:linearscan。最后介紹了llvm12中算法的實(shí)現(xiàn)并對(duì)比了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)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5433

    瀏覽量

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

    關(guān)注

    30

    文章

    4900

    瀏覽量

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

    關(guān)注

    1

    文章

    1661

    瀏覽量

    50196
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

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

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

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

    約束條件進(jìn)行聯(lián)合求解得到的解決方案是相對(duì)更優(yōu)的,但由于無(wú)論是指令調(diào)度還是寄存器分配,都是很復(fù)雜的NP完全問(wèn)題,綜合考慮下,編譯器一般會(huì)分別處理二者。  在LLVM編譯器的設(shè)計(jì)中,
    發(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)化選項(xiàng)問(wèn)題

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

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

    14.7 寄存器分配 編譯器一項(xiàng)很重要的優(yōu)化功能就是對(duì)寄存器分配。與
    發(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)變量、自動(dòng)變量與寄存器變量的存儲(chǔ)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    在現(xiàn)代計(jì)算環(huán)境中,編譯器的性能對(duì)于軟件的運(yùn)行效率至關(guān)重要。Triton 編譯器作為一個(gè)先進(jìn)的編譯器框架,提供了一系列的優(yōu)化技術(shù),以確保生成的代碼既高效又適應(yīng)不同的硬件架構(gòu)。 1. 指令
    的頭像 發(fā)表于 12-25 09:09 ?985次閱讀