LLVM之父分享發明編譯器的經驗 - hpcwire

banq發表於2021-12-28

今天,LLVM 編譯器在現代計算機語言中是必不可少,但早在 2000 年,LLVM(低階虛擬機器)才剛剛起步,作為一種思考如何克服 Java 虛擬機器缺點的新方法。當時,克里斯·拉特納 (Chris Lattner) 是伊利諾伊大學 Vikram Adve 的研究生。

“Java 正在接管世界。這真的很令人興奮。沒有人知道 Java 的界限。我們中的一些人對可能不適合它的那種工作負載有一些擔憂。但是編譯的故事還很早。即時編譯器剛剛出現,”Lattner 回憶道。

上個月參加 SC21 的爐邊談話時,Lattner 漫步在記憶中,談到了LLVM如何 從他 2000 年在伊利諾伊大學厄巴納-香檳分校的碩士論文專案發展成為一個廣泛的社群。他還討論了 LLVM 的未來、他在SwiftMLIR 方面的工作,以及在開源社群工作的回報和挑戰。美國能源部高階科學計算研究辦公室的 Hal Finkel 是採訪者。

“Vikram 和我有一個想法,如果我們採用這種即時編譯器技術,但進行更多的提前編譯,我們可以在整個程式優化分析方面獲得更好的權衡,[並且]構建分析工具,並獲得更好的效能。LLVM(低階虛擬機器)這個名稱很多都來自於採用 Java 虛擬機器並在其下構建一些東西的想法,這是一個您可以對其進行整個程式優化的平臺,”Lattner 說。

“在構建了一大堆基礎設施並學習了所有這些編譯器的東西之後,我只是吃飽了,只是喜歡邊做邊學,我們實際上最終說,好吧,我們構建一個程式碼生成器怎麼樣?我們如何與GCC(GNU Compiler Collection)整合。在很早的時候,它開始是作為 Java 的東西,最終成為面向 C 和靜態編譯的工具語言作為最初的焦點。但它成為了一個非常有用的平臺,可用於大量不同領域的研究和應用。”

當然,Lattner 對程式設計世界並不陌生。他在 LLVM、Clang 和 Swift 方面的大部分工作都是在他在 Apple 期間完成的。Lattner 還在特斯拉領導其自動駕駛團隊短暫工作過。他目前是開發 RISC-V 處理器的SiFive平臺工程高階副總裁。

這裡展示的是 Lattner 對他在 LLVM 社群的工作及其未來的一些評論(略有編輯),點選標題見原文。

 

在 Apple 的時光: “你不明白……沒有什麼能取代 GCC”

當 Lattner 於 2005 年從伊利諾伊大學畢業時,LLVM 仍然是一個高階研究專案。Apple 一直在 GCC 上投入大量資金,我不知道當時是 GCC 技術還是 Apple 的 GCC 團隊,但管理層對缺乏進展感到非常沮喪。我與這位認為編譯器很有趣的 VP 進行了交談,他決定給我一個機會。他僱用了我並說,好的,你可以在這個 LLVM 上工作;話語後面隱藏著最壞的情況是,你是個聰明人,我們可以讓你在 GCC 上工作。

上任幾周後,Lattner 記得曾被一位經驗豐富的 Apple 工程師質疑:GCC 已經存在 20 年了,有數百人在研究它,沒有什麼能取代 GCC,你在浪費時間。Lattner 說:好吧,我不知道,我玩得很開心。

事實證明,圖形領域非常需要即時編譯器,而 LLVM 是一個很好的解決方案。

OpenGL 團隊一直在苦苦掙扎,因為 Apple [正在] 推出 64 位 Mac,並從 PowerPC 轉移到 Intel,以及一堆這樣的東西。他們使用的是手工製作的即時編譯器,而我們能夠使用 LLVM 來解決他們的一系列問題,例如啟用新硬體 [這] 不是 GCC 設計用來做的事情。

所以 [LLVM 的部分] 隨10.4 Tiger 版本(2007)一起提供,提高了圖形效能。這顯示了一些價值並證明了一些投資是合理的。

GPU 團隊試圖為通用 GPU 計算製作一種著色語言,[然後] 變成了我們現在所知的OpenCL,併成為Clang的第一個使用者。

 

合作的風險和回報——“是時候離開了。”

看看 LLVM 社群,你有英特爾、AMD、蘋果、谷歌和索尼以及所有這些正在合作的人。我們讓 [它發揮作用] 的方式之一是受到卓越技術和共同價值觀的推動,以及對成功的共同理解。

作為一個社群,我們總是通過工程師對工程師來解決問題。例如,對我來說,當我在 Apple 或任何附屬機構時,在與社群合作時我會戴上我的 LLVM 帽子,但我會戴上我的 Apple 帽子來解決未發貨硬體的內部問題, 對。我們決定我們許多人所戴的公司帽子不會成為 LLVM 社群的一部分。這不是要提出一個話題,比如我現在需要安裝這個補丁才能釋出。通過吸引志同道合的合作者,共同理解有助於為 LLVM 社群的發展提供資訊。

事情並不總是那麼順利。

多年來,我們不得不將人們逐出社群,這種情況並不常見。當人們決定他們不符合價值體系 [或] 他們不願意與人合作或者他們不符合社群的發展方向時。這非常困難,因為他們中的一些人是多產的貢獻者,而且確實很痛苦,但保持社群凝聚力 [和] 價值體系非常重要

 

LLVM Warts & Redo – 從頭開始​​是個好主意嗎?

“我是 LLVM 最大的批評者,因為我知道所有的問題,”Lattner 半開玩笑地說,並指出 LLVM 現在已經 20 多年了。“LLVM 絕對是一件好事,但無論如何它都不是一件完美的事情。我真的很高興多年來我們能夠在 LLVM 上不斷升級、迭代和改進。但是現在到了關鍵點,某些更改是架構上的,並且很難進行。

其中一個例子是 LLVM 編譯器本身不是內部多執行緒的。LLVM 在迴圈轉換、HPC 風格的轉換、自動並行化、OpenMP 支援方面從未非常出色。LLVM 有效並且非常有用,但它可能會好得多。這些 [弱點] 都可以追溯到 LLVM 中的設計決策,其中 LLVM 的世界觀實際上是一種帶有向量的 C 世界觀。原始設計前提阻礙了某些型別的進化。

當您以並非真正設計使用的方式使用 LLVM 時,它會很慢。例如, 例如,Rust社群以推動LLVM效能的極限而聞名,因為他們的編譯模型例項化了成噸成噸的東西,然後對其進行專門化,專門化,專門化。這給編譯器帶來了巨大的壓力和負擔,這是C語言或更簡單的低階語言所沒有的。這在Rust社群中導致了驚人的事情,但它要求編譯器做所有這些工作,而這些工作是隱含在這個程式設計模型中的。

 

讓 LLVM 變得更好——在谷歌時,Lattner 解決了

MILR 是 LLVM 中的一個子專案,旨在幫助其提供更現代的功能。Lattner 從 Apple 轉到 Google,在那裡他從事 MLIR 的工作。

TensorFlow它確實是一套編譯器技術。它有 TensorFlow 圖。它有這個帶有 HLO 圖的 XLA 編譯器框架。它可以為 CPU 和 GPU 生成程式碼。它還有許多其他技術元件,例如 TensorFlow Lite,這是一個完全獨立的機器學習框架,帶有來回轉換器。

TensorFlow 擁有如此龐大的基礎設施,一個包含“七到八個不同 IR”的生態系統。沒有人像編譯器 IR 那樣構建它們。人們將 TensorFlow 圖視為協議緩衝區,而不是 IR 表示。結果,周圍的質量不是很好,結果是沒有什麼能被真正整合的。不同系統之間存在所有這些不同的技術孤島。人們無法相互交談,因為他們不明白他們都在空間的不同部分解決相同的問題。

MLIR 源於這樣一種想法:如何整合這些完全不同的世界,在這些世界中:你正在開發一個巨大的多節點機器學習加速器,比如 GPU,而我正在開發一個 Arm TensorFlow輕量級移動部署場景。它們之間沒有共同點。

構建編譯器有一個困難的部分:與領域無關。如果你看一下像LLVM這樣的編譯器,LLVM的很大一部分,是所有這些基礎設施,用於測試,用於除錯資訊,用於行走圖,用於構建控制流圖,用於定義呼叫圖,或對通行證管理器進行分析--所有這些東西都是通用的,無論你是構建一個CPU JIT編譯器還是構建一個TensorFlow圖式表示。編譯器基礎設施上的表示法對你的目標領域是不變的。

MLIR 是一個獨立於領域的編譯器基礎設施,允許您在頂部構建特定於領域的垂直領域。它提供了定義你的 IR、你的表示的能力,比如你的加、減、乘、除、儲存。你有哪些核心抽象?例如,在軟體中,您擁有功能。在硬體方面,您有 Verilog 模組。MILR 可以做到這兩點。

Lattner 表示,他不僅很高興看到 MLIR 被整個行業採用,特別是在機器學習類應用中,而且在量子計算等新領域也被採用。“在 SiFive,我們將它用於硬體設計和晶片設計型別的問題——任何地方都可以從編譯器能夠表示設計中受益,”他說。

點選標題見原文。

相關文章