在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

編譯器中的圖論算法是什么

汽車電子技術 ? 來源:程序芯世界 ? 作者:coderSun ? 2023-03-02 16:08 ? 次閱讀

編譯器中的圖論算法

1. 前言

LLVM是一款開源的編譯器框架,近年來已經逐漸超越GCC。

許多深度學習編譯框架TVM、Tensorflow XLA的后端也是使用的它。 正是由于其友好的Lisense,模塊化及統一的IR,使得其越來越流行。因此對LLVM的研究很有必要。

圖片

圖1. LLVM的應用

文中介紹了LLVM中構造支配樹的兩種算法,分別是SLT算法與Semi-NCA算法。構造支配樹的算法,就是圖論在編譯器中的一個應用。如果蛻去LLVM的外衣,相信很多參加過ACM比賽的選手應該對支配樹的構造很熟悉。

本文的目的是以一種通俗易懂的方式給需要了解這個算法的朋友一個感性的認識。如果需要看原論文或者關于深度學習編譯器論文的可以后臺回復idom獲取。

2. 支配樹簡介

2.1 支配樹定義

對于一張有向圖(可以有環),我們規定一個起點,從點到圖上另一個點可能存在多條路徑,對于從到的任意路徑中,都存在一個點 ,即從到必須經過,那么我們稱為的支配點。

用 表示離點最近的支配點, 對于原圖除外,每一個點,從向建一條邊,最后我們得到了一顆以為根的樹,這棵樹就是支配樹(Dominator tree)

2.2 支配樹在編譯器中的應用

  • 計算支配邊界,構造SSA
  • 循環不變量提升

更多應用歡迎補充。

3. 基本概念

3.1 DFS樹

對圖進行深度優先遍歷得到的一顆樹稱為DFS樹。樹上的每一個節點都有一個按照深度優先遍歷的順序得到的編號。

圖片

圖2.深度優先搜索樹

如圖2所示,節點和實線虛線共同構成了一個有向圖,對有向圖進行深度優先遍歷就形成了DFS樹。其中實線是DFS的樹邊。紅色數字表示按照深度優先遍歷的順序得到的編號,紅色字母表示該節點的半必經節點。

3.2 樹邊與非樹邊

如果在DFS樹中存在一條由到的邊,則頂點是頂點的父節點,這條邊稱為樹邊。

記作

如果在有向圖中存在一條到的邊,則頂點是頂點的前驅節點。注意要與父節點相區別,因為父節點是在DFS樹上存在由到的邊。到的邊中除去樹邊以外的邊稱作非樹邊。

的前驅節點記作

非樹邊記作

如圖2中是的父節點。到的邊為樹邊

3.3 祖先與完全祖先

是的祖先,如果在DFS樹中存在一條由到的路徑,可以等于。

記作

如圖2中都是的祖先,因為這些點都可以沿著實線邊(DFS樹邊)到點

是的完全祖先,如果在樹中存在一條由到的路徑,不等于。

記作

如圖2中都是的完全祖先,因為這些點都可以沿著實線邊(DFS 樹邊)到點。與祖先的唯一區別就是不包括自身。

3.4 橫跨邊與返祖邊

右子樹的節點指向左子樹節點的邊。橫跨邊的起點永遠大與終點編號,因為DFS樹中右子樹的遍號永遠大于左子樹的編號。

記作

如圖2所示,的這四條邊都是橫跨邊

子節點到其完全祖先的邊叫返祖邊。

記作

如圖2所示,這兩條邊都是返祖邊。

4. 半支配路徑與半支配節點

在求支配節點之前,我們首先需要了解半支配路徑,然后求出半必經節點及必經節點,最終得到整個支配節點樹。

圖片

圖3. 求支配節點樹路線圖

4.1 半支配路徑

公式表示:

通俗解釋:

在DFS樹中存在一條路徑,如果這條路徑中(不包括起點和終點)的每一個點的編號都大于終點的編號,則該路徑為一條半支配路徑。

根據定義可以將半支配路徑分為兩類:

  • 樹邊半支配路徑

樹邊半支配路徑比較特殊,只包含兩個點,這兩個點在一條樹邊上。

  • 非樹邊半支配路徑

非樹邊半支配路徑即路徑上指向終點的邊為非樹邊,這條非樹邊要么是橫跨邊要么是返祖邊。

如圖4所示,黃色加粗的線為樹邊半支配路徑,綠色和紫色是非樹邊半支配路徑,其中綠色邊含有橫跨邊,紫色邊含有返祖邊。

圖片

圖4. 半支配路徑示意圖

4.2 半支配節點

公式表示:

通俗解釋:

V的半支配節點為所有終點為V的半支配路徑中,起點值最小的那個。

因為半支配路徑有兩類,一是樹邊半支配路徑,二是非樹邊半支配路徑,因此也可以將半支配節點的求法化簡為這兩類

公式化簡:

根據圖形理解更加簡單:

其中黃色線對應公式中的第(1)種情況

紫色線和綠色線對應公式中的第(2)種情況

其中的可以取下圖中和兩種情況, 可以是綠色線或紫色線上的任意一個點,包括或。綠色線或紫色線就是公式中的條件

圖片

圖5.支配節點的三種情況

求半支配節點的偽代碼

Create a DFS tree T.
semi(w) = w | w ∈ V
for w ∈ V ? {r} in reverse preorder by the DFS
    for v ∈ pred G (w)
        u = eval(v)
        if semi(u) < semi(w)
           semi(w) = semi(u)
    end for
    Link parent(w) and w
 end for

其中的 eval(v)就是在求黃色、紫色、綠色各條線上 semi 最小的點。因為是對 DFS 樹進行逆序,因此求 的時候紫色線和綠色線上各節點的 semi 值已經是已知的了。

5. 支配節點與支配樹

LLVM在2017年之前采用的是SLT算法,新的版本使用的是semi-NCA算法。兩者都是在上一節介紹的半必經節點的基礎上求得必經節點。下文會分別對這兩種算法進行介紹,并比較其時間復雜度。

5.1 SLT 算法

SLT算法會根據前文求出的半支配節點進一步求出直接支配節點。

公式表示:

其中在

u

通俗解釋:

在DFS樹中,到的路徑上有一點,的sdom值是該路徑上最小的點,如果等于則等于,否則等于

下面的兩張圖是對求 idom 的公式兩種情況的一個總結,可以讓我們的理解更加直觀。

公式中的情況1圖片公式中的情況2圖片

計算支配節點樹的偽代碼:

Create a DFS tree T.
for w ∈ V ? {r} in reverse preorder by the DFS
  Calculate semi dominator for w
  Add w to bucket of semi(w)
  while bucket of parent(w) is not empty do
    v = pop one element from the bucket
    u = eval(v)
    if semi(u) < semi(v) then
      idom(v) = u
    else
      idom(v) = semi(v)
    end if
  end while
end for
for w ∈ V ? {r} in preorder by the DFS do
  if idom(w) != semi(w) then
    idom(w) = idom(idom(w))
  end if
end for

以一個實例加深對SLT算法的理解:

圖片

  • a)此時 semi(4)=2,因此 bucket(2)=4。
  • b)此時 semi(3)=1,因此 bucket(1)=3。此時 parent(3)=2,將 bucket(2)中的4彈出,2到4的路徑上3的semi值最小,滿足代碼中的if 條件,因此idom(4)=3
  • c)此時semi(2)=0,因此bucket(0)=2。此時parent(2)=1,將bucket(1)中的3彈出,1到3的路徑上2的semi值最小,滿足代碼中的if條件,因此idom(3)=2
  • d)此時semi(1)=0,因此 bucket(0)={2,1},此時 parent(1)=0,將 bucket(0)中的棧頂元素 1 彈出,滿足 else 條件,idom(1)=0,繼續將 bucket(0)中的2彈出,滿足else條件,idom(2)=0
  • e)最后執行下一個循環,直接支配節點與半支配節點進行比較,此時 idom(3)不等于sdom(3),idom(4)不等于sdom(4),因此idom(3)=idom(2)=0,idom(4)=idom(idom(3))=0

5.2 semi-NCA 算法

與上文介紹的SLT算法相比,semi-NCA算法無疑更容易理解,這也是目前 LLVM正在使用的算法。下面直接上代碼,相信大家一看就能夠理解。

Create a DFS tree T.
Calculate semidominator for w
Create a tree D and initialize it with r as the root.
for v ∈ V ? {r} in preorder by the DFS do
  Ascend the path r *—>DparentT(v) and ?nd the deepest vertex which number is smaller than or equal to sdom(v).
  set this vertex as parent for v in D.
end for

為了方便理解,來看下面這個簡單實例:

圖片

semi-NCA算法實例

  • 圖 a)是已經求出的半支配節點圖,左邊的數字表示每個節點的半支配節點。
  • 圖 b)是支配節點樹(代碼中的 D 樹),目前只求出來 0 到 4 節點的支配節點。
  • 圖 c)是求節點 5 支配節點的一個實例。節點 5 在 DFS 樹中的父節點是 4。因此在 D 中沿著根節點 0 到 4 的路徑上找到第一個小于 semi(5)的節點,此節點為 0,也就是 5 的直接支配節點。

小結

本節主要介紹了 LLVM 中求支配節點樹的兩種算法,分別是 SLT 和 semi-NCA 算法。兩種算法的時間復雜度和空間復雜度如下。

算法 時間復雜度 空間復雜度
SLT O(mlogn) O(m+n)
semi-NCA O(n^2) O(m+n)

對于算法的詳細分析、證明和實驗結果可以參考原論文。

6. 后記

本篇文章缺少算法的證明,僅提供一些自己在學習過程中對這兩個算法感性的認識,避免枯燥的公式。希望能夠給需要學習這個算法的人提供一些幫助。

后續準備寫一個編譯器中的圖論算法系列,題目如下:

  • 編譯器中的圖論算法之支配樹
  • 編譯器中的圖論算法之支配邊界

歡迎各位朋友幫忙補充更多的編譯器中用到的圖論算法或者其它感興趣的編譯器中的算法。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 框架
    +關注

    關注

    0

    文章

    403

    瀏覽量

    17488
  • 編譯
    +關注

    關注

    0

    文章

    657

    瀏覽量

    32871
  • TVM
    TVM
    +關注

    關注

    0

    文章

    19

    瀏覽量

    3663
收藏 人收藏

    評論

    相關推薦

    ICC AVR編譯器的安裝與使用

    ICCAVR編譯器的安裝、運行、破解、使用 用ICCAVR編譯器產生初始化程序和程序框架
    發表于 07-09 18:06 ?258次下載

    PICC編譯器下載

    PICC編譯器下載
    發表于 05-25 17:44 ?168次下載

    NEC編譯器培訓手冊

    NEC編譯器培訓手冊,開發者可根據功能要求對編譯器進行設計。
    發表于 05-03 14:23 ?15次下載

    編譯器是如何工作的_編譯器的工作過程詳解

    隨著計算機的發展,編譯器已經發揮著十分重要的作用。本文主要介紹了編譯器的種類、編譯器的工作原理以及編譯器工作的具體操作過程及步驟詳解。
    發表于 12-19 12:54 ?1.6w次閱讀

    編譯器原理到底是怎樣的帶你簡單的了解編譯器原理

    編程語言是怎樣工作的 理解編譯器內部原理,可以讓你更高效利用它。按照編譯的工作順序,逐步深入編程語言和編譯器是怎樣工作的。本文有大量的鏈接、樣例代碼和圖表幫助你理解編譯器
    的頭像 發表于 12-23 17:25 ?1.1w次閱讀

    編譯器對芯片行業到底有什么意義

    2019年科技行業有一個熱點“華為開源方舟編譯器”,編譯器這個名詞開始不斷的進入國人的視野。作為民族自主品牌的驕傲,華為為什么投入巨大的人力開發方舟編譯器并將它開源,編譯器在華為乃至整
    的頭像 發表于 02-20 14:22 ?8784次閱讀
    <b class='flag-5'>編譯器</b>對芯片行業到底有什么意義

    Verilog HDL 編譯器指令說明

    Verilog HDL 編譯器指令 復雜一點的系統在進行設計或者驗證時,都會用到一些編譯器指令,那么什么是編譯器指令? ? Verilog HDL編譯器指令由重音符(‘)開始。在Ver
    的頭像 發表于 11-03 09:31 ?3746次閱讀
    Verilog HDL <b class='flag-5'>編譯器</b>指令說明

    交叉編譯器安裝教程

    交叉編譯器“交叉”的意思就是在一個架構上編譯另外一個架構的代碼,相當于兩種架構“交叉”起來了。Ubuntu 自帶的 gcc 編譯器是針對 X86 架構的,而我們現在要
    的頭像 發表于 09-29 09:12 ?3514次閱讀

    領域編譯器發展的前世今生

    。與此同時,編譯器的開發人員也從芯片研發團隊開始延伸到更上層的軟件層面。在很多領域的軟件系統,都開始引入編譯技術來實現提升開發效率或運行效率等目標。本文從領域編譯器的角色著眼,來討論
    的頭像 發表于 02-03 10:37 ?1711次閱讀

    編譯器的優化選項

    一個程序首先要保證正確性,在保證正確性的基礎上,性能也是一個重要的考量。要編寫高性能的程序,第一,必須選擇合適的算法和數據結構;第二,應該編寫編譯器能夠有效優化以轉換成高效可執行代碼的源代碼,要做到
    的頭像 發表于 11-24 15:37 ?906次閱讀
    <b class='flag-5'>編譯器</b>的優化選項

    Triton編譯器功能介紹 Triton編譯器使用教程

    Triton 是一個開源的編譯器前端,它支持多種編程語言,包括 C、C++、Fortran 和 Ada。Triton 旨在提供一個可擴展和可定制的編譯器框架,允許開發者添加新的編程語言特性和優化技術
    的頭像 發表于 12-24 17:23 ?347次閱讀

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

    Triton編譯器與其他編譯器的比較主要體現在以下幾個方面: 一、定位與目標 Triton編譯器 : 定位:專注于深度學習中最核心、最耗時的張量運算的優化。 目標:提供一個高度抽象、靈活、高效
    的頭像 發表于 12-24 17:25 ?322次閱讀

    Triton編譯器在機器學習的應用

    1. Triton編譯器概述 Triton編譯器是NVIDIA Triton推理服務平臺的一部分,它負責將深度學習模型轉換為優化的格式,以便在NVIDIA GPU上高效運行。Triton編譯器支持
    的頭像 發表于 12-24 18:13 ?338次閱讀

    Triton編譯器的優化技巧

    在現代計算環境編譯器的性能對于軟件的運行效率至關重要。Triton 編譯器作為一個先進的編譯器框架,提供了一系列的優化技術,以確保生成的代碼既高效又適應不同的硬件架構。 1. 指令
    的頭像 發表于 12-25 09:09 ?176次閱讀

    Triton編譯器在高性能計算的應用

    高性能計算(High-Performance Computing,HPC)是現代科學研究和工程計算不可或缺的一部分。隨著計算需求的不斷增長,對計算資源的要求也越來越高。Triton編譯器作為一種
    的頭像 發表于 12-25 09:11 ?191次閱讀
    主站蜘蛛池模板: 色综合综合网| 特一级黄色毛片| 成人在线一区二区三区| 二级黄色大片| 99草视频| 天天干夜夜怕| 美女屁屁免费视频网站| 国产播放啪视频免费视频| rrr523亚洲国产片| 美女扒开腿让男生桶爽网站| 一二三区电影| 四虎精品影院2022| 久久亚洲一级毛片| 99久久免费精品视频| 49pao强力在线高清基地| 色吧亚洲欧美另类| 午夜精品福利在线观看| 欧洲综合网| 国产日本三级| 天天鲁天天爽精品视频| 亚洲不卡视频| 特级aaaaaaaaa毛片免费视频| 成年人网站黄色| 狠狠干激情| 天天躁夜夜躁狠狠躁2021西西| 三级黄色网址| 国产大乳喷奶水在线看| 人人干夜夜操| 一区中文字幕| 性欧美video视频另类| 九色在线播放| 人人干人人艹| 亚洲性天堂| 91网视频在线观看| 欧美日本一区二区三区生| 日韩欧美一级| 788gao这里只有精品| 91精品日本久久久久久牛牛| 中文字幕首页| 久久综合五月婷婷| 失禁h啪肉尿出来高h健身房|