在編程加速器時(應用程序將某些任務卸載到系統硬件,特別是為了加速該任務),您必須構建一個全新的軟件支持。硬件加速器可以以比CPU快幾個數量級的速度運行某些任務,但它們不能開箱即用。軟件需要有效地使用加速器的指令,使其與整個應用系統兼容,這意味著維護新芯片的工作量非常大。
現在,麻省理工學院計算機科學與人工智能實驗室 (CSAIL) 的科學家創建了一種名為“Exo”的新編程語言,用于在硬件加速器上編寫高性能代碼。Exo 幫助低級性能工程師將指定他們想要計算的非常簡單的程序轉換為非常復雜的程序,這些程序與規范執行相同的操作,但通過使用這些特殊的加速器芯片要快得多。例如,工程師可以使用 Exo 將簡單的矩陣乘法轉換為更復雜的程序,通過使用這些特殊的加速器,該程序的運行速度提高了幾個數量級。
與其他編程語言和編譯器不同,Exo 是圍繞一個稱為“Exocompilation”的概念構建的。“傳統上,許多研究都集中在自動化特定硬件的優化過程上,”博士 Yuka Ikarashi 說。電氣工程和計算機科學專業的學生,??CSAIL 附屬機構,他是有關 Exo 的新論文的主要作者。“這對大多數程序員來說都很好,但對于性能工程師來說,編譯器會經常出現問題,因為它有幫助。因為編譯器的優化是自動的,所以當它做錯事并給你 45% 的時候,沒有好的方法可以修復它效率而不是 90%。”
借助 Exocompilation,性能工程師重新回到了駕駛座上。選擇應用哪些優化、何時以及以何種順序從編譯器外部化的責任返回給性能工程師。這樣,他們一方面不必浪費時間與編譯器抗爭,另一方面也不必手動完成所有工作。同時,Exo 負責確保所有這些優化都是正確的。因此,性能工程師可以花時間提高性能,而不是調試復雜的優化代碼。
康奈爾大學計算機科學系助理教授 Adrian Sampson 說:“Exo 語言是一種在其目標硬件上參數化的編譯器;同一個編譯器可以適應許多不同的硬件加速器。” “Exo 無需編寫一堆雜亂的 C++ 代碼來編譯新的加速器,而是為您提供了一種抽象、統一的方式來寫下您想要定位的硬件的‘形狀’。然后您可以重用現有的 Exo 編譯器來適應新的描述,而不是從頭開始編寫全新的東西。這樣的工作的潛在影響是巨大的:如果硬件創新者可以不再擔心為每個新硬件創意開發新編譯器的成本,他們就可以嘗試并發布更多創意.
當今制造的最高性能計算機芯片,例如 Google 的 TPU、Apple 的神經引擎或 NVIDIA 的 Tensor Cores,通過加速稱為“關鍵子程序”、內核或高性能計算 (HPC) 的東西來為科學計算和機器學習應用程序提供動力。 ) 子程序。
除了笨拙的行話,這些程序是必不可少的。例如,稱為基本線性代數子程序 (BLAS) 的東西是一個“庫”或此類子程序的集合,專門用于線性代數計算,并支持許多機器學習任務,如神經網絡、天氣預報、云計算和藥物發現. (BLAS 非常重要,以至于它在 2021 年為 Jack Dongarra 贏得了圖靈獎。)然而,這些需要數百名工程師設計的新芯片只能在這些 HPC 軟件庫允許的范圍內發揮作用。
但是,目前這種性能優化仍然是手動完成的,以確保這些芯片上的每個最后一個計算周期都被使用。HPC 子程序經常以超過 90% 的峰值理論效率運行,硬件工程師不遺余力地為這些理論峰值額外增加 5% 或 10% 的速度。因此,如果軟件沒有進行積極的優化,那么所有的辛勤工作都會被浪費掉——這正是 Exo 幫助避免的。
Exocompilation 的另一個關鍵部分是性能工程師可以描述他們想要優化的新芯片,而無需修改編譯器。傳統上,硬件接口的定義由編譯器開發人員維護,但對于大多數這些新的加速器芯片,硬件接口是專有的。公司必須維護自己的整個傳統編譯器的副本(分叉),經過修改以支持他們的特定芯片。除了性能工程師之外,這還需要雇用編譯器開發人員團隊。
“在 Exo 中,我們將特定于硬件的后端的定義從 exocompiler 外部化。這使我們能夠更好地將 Exo(一個開源項目)和特定于硬件的代碼(通常是專有的)分開。我們已經展示了“我們可以使用 Exo 快速編寫與英特爾手動優化的數學內核庫一樣高性能的代碼。我們正在積極與多家公司的工程師和研究人員合作,”加州大學伯克利分校的博士后 Gilbert Bernstein 說。
Exo 的未來需要探索一種更高效的調度元語言,并擴展其語義以支持并行編程模型,從而將其應用于更多的加速器,包括 GPU。
原文鏈接:A programming language for hardware accelerators