[分享] 實作在GCC上的平行化編譯

看板CompilerDev作者 (夏克維夫)時間5年前 (2020/08/24 02:18), 5年前編輯推噓4(404)
留言8則, 5人參與, 5年前最新討論串1/1
前幾天GCC社群有個不小的新聞:新的 "-fparallel-job=<N>" 選項可以讓編譯流程 本身平行化 有別於許多近代 build system 早已提供的檔案層級平行化(i.e. 把個別檔案的編譯工作 都到獨立的一個thread) 編譯器本身的平行化(i.e.把編譯器內部的工作平行化)一直以來都沒有登上 主流 因此我聽到這個消息以後非常的興奮 事實上這個計畫大概在去年底就有個雛形了: https://youtu.be/jd6R3IK__1Q
我也會就這個影片做講解(P.S.雖然內容很讚但這個演講本身的品質...有待加強XD) 這個計畫最大的動機是大型檔案的編譯速度太慢 同時也是前述build system檔案層級平行化無法解決的問題 如果把GCC各部分(e.g. frontend, backend)的處理時間攤開來看 可以得到以下分佈: https://imgur.com/35KzIRj
其中很明顯的RTL,也就是backend/code generation的部分花最多時間 第二多的則是target independent、intra-procedural的優化與analyses (也就是GIMPLE) 雖然RTL佔的時間最多 但該計畫的作者認為 GIMPLE 比較好改 所以就先嘗試將每個function丟到獨立的thread裡面做 GIMPLE 優化 https://imgur.com/bpah6Q4
當然就如影片裡面所示 有一堆全域的資料結構因為race condition的緣故要修改 最終實驗結果如下: https://imgur.com/Blb6Tye
5~6%的加速...雖然已經很好了 但如果把這項技術也用在RTL上的話... https://imgur.com/wD9422B
30~60%的加速 這個就真的蠻驚人了 雖然我很想吐槽:繞了一大圈你還不是要平行化RTL (笑 ======== 即便得到了一個如此亮眼的數字 我想最大的問題在於: 通常你有一個超超超大的檔案 你會想直接把他切小一點 而不是那麼費工地平行化編譯器 我認為並不是這想法本身有問題 而是因為用multi-threading本身的overhead還蠻大的 所以你的檔案真的要超級超級大 用這個技術才划得來 但如果如此的大 就像上面所說的:直接切小一點會比較快 又或者是說:會產生如此大檔案的情況少之又少 這種corner case 真的值得你花那麼多 時間去研究以及維護嗎?別忘了GCC是一個持續成長的開源專案 如果這項技術導致以後 一些更重要的功能難以實作 難保不會有人質疑這技術的必要性 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 169.234.228.215 (美國) ※ 文章網址: https://www.ptt.cc/bbs/CompilerDev/M.1598206736.A.EF3.html

08/24 08:01, 5年前 , 1F
弱弱的問一句 跟原本的-j4 差在哪裡啊?
08/24 08:01, 1F

08/24 11:23, 5年前 , 2F
make -j4是在Makefile有多個獨立工作的情況下平行
08/24 11:23, 2F

08/24 11:25, 5年前 , 3F
e.g. 對多個不同的.c檔gcc 最後再link多個.o檔
08/24 11:25, 3F

08/24 21:23, 5年前 , 4F
還是有需要的吧?寫 template、header only 等都可能會
08/24 21:23, 4F

08/24 21:23, 5年前 , 5F
讓 code 膨脹。若說是大檔案的話,拆散後為了效能去開
08/24 21:23, 5F

08/24 21:23, 5年前 , 6F
LTO 不也有點奇怪?
08/24 21:23, 6F
對吼有道理 差點都忘了template所造成的潛在code size膨脹 ※ 編輯: mshockwave (169.234.228.215 美國), 08/25/2020 11:24:52

08/26 16:52, 5年前 , 7F
-j4 應該就是一開始講的、檔案層級的平行化吧?
08/26 16:52, 7F

08/30 11:24, 5年前 , 8F
gcc的global var 真的多到哭爸...
08/30 11:24, 8F
文章代碼(AID): #1VGhCGxp (CompilerDev)