国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

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

3天內不再提示

SCEV如何對變量進行分析優化

openEuler ? 來源:openEuler ? 作者:openEuler ? 2022-07-07 11:16 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

0. 基礎知識盤點

0.1 循環(loop)

定義
loop(llvm里理解為natural loop)是定義在CFG中的一個結點集合L,并具有以下屬性[1][2]:

有單一的入口結點(稱為header),該結點支配loop中的所有結點;

存在一條進入循環頭的回邊;

相關術語

entering block:一個非loop內的結點有一條邊連接到loop。當只有一個entering block且其只有一條邊連接到header,稱之為preheader;作為非loop結點的peheader支配整個loop;

latch:有一條邊連接到header;

backedge:稱為回邊,一條從latch到header的邊;

exiting edge:一條邊從loop內到loop外,邊的出發結點稱之為exiting block,目標結點稱之為exit block;

10e78e90-fd25-11ec-ba43-dac502259ad0.jpg

上面右圖中,黃色區域是一個loop,而紅色區域不是,為什么呢?
因為紅色區域a和c都是入口結點,不滿足單一入口結點的性質。

0.2 Scalar Evolution(SCEV)

定義

SCEV是編譯器對變量進行分析的優化(往往只針對整數類型),且主要用于分析循環中變量是如何被更新的,然后根據這個信息來進行優化。

循環鏈

如圖所示,循環中歸納變量var的起始值為start,迭代的方式為?,步長為step;

10f6beec-fd25-11ec-ba43-dac502259ad0.jpg

它的循環鏈(chrec,Chains of Recurrences)如下:

var = {start, ? , step}
// ?∈{+,?}
// start: starting value
// step: step in each iteration

舉個例子:

intm=0;
for(inti=0;i

那么m的循環鏈為:m = {0,+,n}。

1. Induction Variable(歸納變量)

1.1 定義

循環的每次迭代中增加或減少固定量的變量,或者是另一個歸納變量的線性函數。

舉個例子[3],下面循環中的i和j都是歸納變量:

for(i=0;i

1.2 益處

歸納變量優化的好處,有但不局限于以下幾點:

用更簡單的指令替換原來的計算方式。
比如,上面的例子中識別到歸納變量,將對應的乘法替換為代價更小的加法。

j=-17;
for(i=0;i

減少歸納變量的數目,降低寄存器壓力。

externintsum;
intfoo(intn){
inti,j;
j=5;
for(i=0;i

當前的loop有兩個歸納變量:i、j,用其中一個變量表達另外一個后,如下:

externintsum;
intfoo(intn){
inti;
for(i=0;i

歸納變量替換,使變量和循環索引之間的關系變得明確,便于其他優化分析(如依賴性分析)。舉例如下,將c表示為循環索引相關的函數:

intc,i;
c=10;
for(i=0;i

轉換為:

intc,i;
c=10;
for(i=0;i

2. 實踐

2.1 相關編譯選項

compiler option
gcc -fivopt
畢昇 -indvars

2.2 優化用例

歸納變量的優化(ivs)在llvm中的位置是:llvmlibTransformsScalarIndVarSimplify.cpp
讓我們通過一個用例,看看畢昇編譯器的優化過程。
如下圖,假設上面func里面的部分就是要優化的代碼,下面func里面就是預期生成的結果:

11136ae2-fd25-11ec-ba43-dac502259ad0.jpg

它的IR用例test.ll是:

11261e44-fd25-11ec-ba43-dac502259ad0.jpg

編譯命令是:

opt test.ll -indvars -S

當前的例子中,header、latch和exiting block都是同一個BB,即bb5。

11418b5c-fd25-11ec-ba43-dac502259ad0.jpg

步驟一:依據 def-use 關系,遍歷loop的 ExitBlock 中phi結點的操作數的來源,計算出最終值同時替換它,繼而替換該phi結點的使用。
例子中,計算 %tmp2.lcssa ,其唯一的操作數是 %tmp2 = add nuw nsw i32 %i.01.0, 3 ,該表達式所在的loop是bb5,此時 %tmp2 的循環鏈為

%tmp2={3,+,3}<%bb5>

獲取當前loop的不退出循環的最大值是199999,那當前 %tmp2=add(3, mul(3,199999))=600000;接下來會看當前的替換不是高代價(代價的計算會依據不同架構有所不同),同時在phi結點的 user 中替換該值。優化結果如下:

1154e684-fd25-11ec-ba43-dac502259ad0.jpg

步驟二:遍歷 ExitingBlock ,對其跳轉條件進行計算,依據 def-use 的關系,刪除相應的指令。
例子中,計算出 br i1 %0, label %bb5, label %bb7 的 %0 是 false,跳轉指令替換后,%0 = icmp ult i32 %tmp4,200000 不存在 user,將其加入到“死指令”中。優化結果如下:

11690db2-fd25-11ec-ba43-dac502259ad0.jpg

步驟三:刪除所有“死指令”,并看看他的操作數是否要一并刪除。
例子中,作為 %0 的操作數的 %tmp4 還有其他的 user %x.03.0,因此不能被視為“死指令”被刪除。優化結果如下:

118b3f04-fd25-11ec-ba43-dac502259ad0.jpg

步驟四:刪除 HeaderBlock 中的“死”phi結點。
例子中, %tmp4 和phi結點 %x.03.0 構成了一個不會有成果的循環,就會刪除它們,同理刪除 %tmp2 和 %i.01.0 。優化結果如下:

11c0930c-fd25-11ec-ba43-dac502259ad0.jpg

原文標題:編譯器優化那些事兒(4):歸納變量

文章出處:【微信公眾號:openEuler】歡迎添加關注!文章轉載請注明出處。

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

    關注

    31

    文章

    5608

    瀏覽量

    129969
  • 編譯器
    +關注

    關注

    1

    文章

    1672

    瀏覽量

    51600
  • CFG
    CFG
    +關注

    關注

    0

    文章

    10

    瀏覽量

    10139

原文標題:編譯器優化那些事兒(4):歸納變量

文章出處:【微信號:openEulercommunity,微信公眾號:openEuler】歡迎添加關注!文章轉載請注明出處。

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    API數據分析:淘寶流量來源分析,渠道優化

    ? 在電商領域,流量來源分析優化營銷策略的核心。淘寶作為中國領先的電商平臺,其流量數據可通過API(應用程序接口)高效獲取和分析。本技術帖將逐步指導您如何利用淘寶API進行流量來源
    的頭像 發表于 01-23 13:42 ?173次閱讀
    API數據<b class='flag-5'>分析</b>:淘寶流量來源<b class='flag-5'>分析</b>,渠道<b class='flag-5'>優化</b>!

    【產品介紹】Altair OptiStruct結構分析優化軟件

    AltairOptiStruct支持結構分析優化OptiStruct是一款久經考驗且成熟的現代化結構求解器,它可為線性和非線性分析提供綜合、準確且可擴展的解決方案,適用于多個學科,包括靜力學和動力學
    的頭像 發表于 01-06 17:56 ?1393次閱讀
    【產品介紹】Altair OptiStruct結構<b class='flag-5'>分析</b><b class='flag-5'>優化</b>軟件

    請問Keil的優化等級到底該如何選擇?

    做任何優化。代碼的執行順序與源代碼完全一致,變量始終存儲在內存中(不進行寄存器優化),函數調用棧幀清晰。 -O1 (有限優化 / Opti
    發表于 11-20 07:51

    Coremark測試集分析與性能優化思路

    需要執行switch和if語句。因此,這部分代碼使用一個小型摩爾狀態機,它將字符串輸入標識為數字,并根據格式對其進行劃分。 狀態機將解析輸入字符串,直到遇到“,”分隔符或輸入結束。無效數字將導致狀態機
    發表于 10-24 08:21

    如何對蜂鳥e203內核乘除法器進行優化

    器:對每個流水線階段中的數據進行部分商和余數的計算和累加操作。 二、優化方案 優化乘法器 為了提高蜂鳥E203的乘法器性能,可以采取以下幾個優化方案: 采用更高效的算法:Booth算
    發表于 10-24 06:47

    改進wallance樹乘法器優化方法

    首先,根據之前分享的乘法器的優缺點,我們針對17周期的乘法器進行優化,為乘法設計的專用數據通路,為了保持e203的低功耗、低面積的優點、我們仍采用基4booth算法進行部分積生成,而對于原有的17
    發表于 10-23 06:37

    影響同步帶模組成本的五大核心變量分析

    影響同步帶模組成本的五大核心變量
    的頭像 發表于 10-15 17:52 ?590次閱讀
    影響同步帶模組成本的五大核心<b class='flag-5'>變量分析</b>

    推進電機端蓋結構的抗沖擊分析優化

    。同時以此為基礎,在保證推進電機的抗沖擊性能的約束前提條件下,以提高電機的轉矩密度為目標,建立了相應的數學模型和參數化的有限元模型,對該結構進行了設計優化,為實際工程設計了奠定基礎。 純分享帖,需要者可點
    發表于 06-23 07:12

    VirtualLab:光柵的優化分析

    光柵是光學工程師使用的最基本的工具。為了設計和分析這類組件,快速物理光學建模和設計軟件VirtualLab Fusion為用戶提供了許多有用的工具。其中包括參數優化,以輕松優化系統,以及參數運行,它
    發表于 05-23 08:49

    VirtualLab 應用:傾斜光柵的參數優化及公差分析

    允許為目標值定義參數約束和權重值。更多信息請參見: 參數優化文檔的介紹 第一級次的參數優化 **結果——公差分析 **
    發表于 05-22 08:52

    RAKsmart服務器SEO優化優勢分析

    在RAKsmart服務器上搭建SEO網站,可以借助其基礎設施和服務特性,從技術層面優化搜索引擎排名。以下是具體優勢及分析,主機推薦小編為您整理發布RAKsmart服務器SEO優化優勢分析
    的頭像 發表于 04-22 10:12 ?664次閱讀

    Ansible Playbook中的變量使用技巧

    在inventory中定義的連接變量(比如ansible_ssh_user);優先級第二。
    的頭像 發表于 04-15 10:26 ?986次閱讀

    VirtualLab Fusion應用:使用optiSLang進行光柵優化

    1.摘要 當代光學系統的優化往往涉及大量參數。正如光柵的優化設計,不僅需要考慮光柵的幾何參數,更需要分析所需的入射方向。這樣的需求導致優化過程面臨大量參數的挑戰。在本實例中,Virtu
    發表于 03-18 08:51

    VirtualLab Fusion應用:非近軸衍射分束器的設計與優化

    )的結構設計生成一系列分束器的初始設計,然后通過傅里葉模態法或嚴格耦合波分析(FMM/RCWA)進一步優化。為了給最后一個優化步驟定義一個合適和有效的優化函數,應用了可編程光柵
    發表于 03-10 08:56

    VirtualLab Fusion應用:使用自定義的評價函數優化高NA分束器

    嚴格的后優化,至少建議進行嚴格的分析。在這個用例中,使用奇數衍射級對典型的二元1:6分束器執行這樣嚴格的評估。為此,對初始系統的結構進行了參數化,并通過可編程光柵
    發表于 03-07 08:54