Halide 是一種程式語言,旨在讓在現代機器上編寫高效能圖像和陣列處理程式碼變得更加容易。 Halide 目前的目標:
Halide 不是一種獨立的程式語言,而是嵌入在 C++ 中。這意味著您編寫 C++ 程式碼,使用 Halide 的 C++ API 建立 Halide 管道的記憶體中表示。然後,您可以將此表示形式編譯為目標文件,或對其進行 JIT 編譯並在同一進程中執行。 Halide 也提供了 Python 綁定,為在 Python 中編寫嵌入的 Halide(無需 C++)提供全面支援。
Halide 需要 C++17(或更高版本)才能使用。
有關 Halide 的更多詳細信息,請參閱 https://halide-lang.org。
有關 API 文檔,請參閱 https://halide-lang.org/docs。
有關一些範例程式碼,請閱讀 https://halide-lang.org/tutorials 上的線上教學。對應的程式碼在tutorials/
目錄下。更大的範例位於apps/
目錄中。
如果您已獲得完整的原始碼發行版並想要建立 Halide,請參閱下面的註釋。
從 Halide 19.0.0 開始,我們在 PyPI 上提供二進制輪子。 Halide 提供 C++ 和 Python 的綁定。即使您只想使用 C++ 中的 Halide,pip 也可能是取得 Halide 二進位版本的最簡單方法。
完整版本可以使用pip
安裝,如下所示:
$ pip install halide
對main
每次提交都會作為開發版本發佈到 Test PyPI,並且可以使用一些額外的標誌來安裝這些版本:
$ pip install halide --pre --extra-index-url https://test.pypi.org/simple
目前,我們提供的輪子適用於:Windows x86-64、macOS x86-64、macOS arm64 和 Linux x86-64。 Linux 輪子是為 Manylinux_2_28 建構的,這使得它們廣泛相容(Debian 10、Ubuntu 18.10、Fedora 29)。
對於 pip 套件的 C++ 使用:在 Linux 和 macOS CMAKE_PREFIX_PATH
,只要您位於安裝 Halide 的相同虛擬環境中,CMake 的find_package
指令就應該找到 Halide。這可以透過在cmd
中運行set CMAKE_PREFIX_PATH=%VIRTUAL_ENV%
來完成。
其他建置系統可以透過執行python -c "import halide; print(halide.install_dir())"
找到 Halide 根路徑。
或者,如果您使用 macOS,則可以透過 Homebrew 安裝 Halide,如下所示:
$ brew install halide
最新版本的 Halide 隨時可以在 GitHub 上找到:https://github.com/halide/Halide/releases
我們為許多流行的平台和架構提供二進位版本,包括 32/64 位元 x86 Windows、64 位元 x86/ARM macOS 和 32/64 位元 x86/ARM Ubuntu Linux。
macOS 版本是使用 XCode 的命令列工具和 Apple Clang 500.2.76 建構的。這意味著我們連結到 libc++ 而不是 libstdc++。如果您使用的是較舊的 XCode(不預設為 libc++),您可能需要相應地調整編譯器選項。
我們使用最新的 Ubuntu LTS 來建立 Linux 版本;如果您的發行版太舊,它可能沒有必需的 glibc。
Halide 的夜間建置以及我們在 CI 中使用的 LLVM 版本也可以在 https://buildbot.halide-lang.org/ 上找到。
如果您使用 vcpkg 來管理依賴項,您可以透過下列方式安裝 Halide:
$ vcpkg install halide:x64-windows # or x64-linux/x64-osx
需要注意的是:vcpkg 僅安裝為活動平台編譯程式碼所需的最低限度的 Halide 後端。如果您想包含所有後端,則應該安裝halide[target-all]:x64-windows
。請注意,由於這將建置 LLVM,因此將佔用大量磁碟空間(最多 100GB)。
我們有興趣將 Halide 引入其他流行的套件管理器和 Linux 發行版儲存庫!我們在此 GitHub 問題中追蹤 Halide 的各種發行版的狀態。如果您有發布包的經驗,我們很樂意與您合作!
有兩組與 Halide 相關的平台需求:以 JIT 或 AOT 模式執行編譯器函式庫所需的平台要求,以及執行 AOT 編譯器的二進位輸出所需的平台要求。
這些是經過測試的主機工具鍊和平台組合,用於建立和運行 Halide 編譯器庫。
編譯器 | 版本 | 作業系統 | 架構 |
---|---|---|---|
海灣合作委員會 | 9.5 | Ubuntu Linux 20.04 LTS | x86、x64 |
海灣合作委員會 | 11.4 | Ubuntu Linux 22.04 LTS | ARM32、ARM64 |
MSVC | 2022 (19.37) | Windows 11 (22631) | x86、x64 |
蘋果鏗鏘 | 15.0.0 | macOS 14.4.1 | x64 |
蘋果鏗鏘 | 14.0.0 | macOS 14.6 | ARM64 |
一些使用者已經使用 Clang 9.0.0+ 成功建置了適用於 Linux 的 Halide,使用 ClangCL 11.0.0+ 成功建置了適用於 Windows 的 Halide,以及透過與 MSVC 交叉編譯建置了適用於 Windows ARM64 的 Halide。但是,我們不會主動測試這些場景,因此您的情況可能會有所不同。
除此之外,我們願意支持(透過接受 PR)平台和工具鏈組合,這些組合仍然從其原始供應商那裡獲得積極的第一方公共支持。例如,在撰寫本文時,這不包括 Windows 7,但包括 Ubuntu 18.04 LTS。
編譯後的 AOT 管道預計將獲得更廣泛的平台支援。二進位檔案使用 C ABI,我們希望任何相容的 C 編譯器都能夠正確使用產生的標頭。 C++ 綁定目前需要 C++17。如果您發現產生的管道有相容性問題,請提出問題。
在任何時間點,建置 Halide 都需要 LLVM 的最新穩定版本、LLVM 的先前穩定版本或 trunk。在撰寫本文時,這意味著支援版本 19、18 和 17,但不支援版本 16。
最簡單的方法是使用 Homebrew 在 macOS 上取得 LLVM 的二進位版本。只需運行brew install llvm
即可。在 Debian 版本的 Linux 上,LLVM APT 儲存庫是最好的;使用提供的安裝腳本。我們知道沒有適合 Windows 的官方二進位版本,但是我們在 CI 中使用的二進位版本通常可以在 https://buildbot.halide-lang.org 上找到,以及我們其他測試平台的 tarball。請參閱下面有關 Windows 的部分以取得更多建議。
如果您的作業系統沒有 LLVM 的軟體包,或者您想要對配置有更多控制,您可以自己建立它。首先從GitHub上查看:
$ git clone --depth 1 --branch llvmorg-18.1.8 https://github.com/llvm/llvm-project.git
(LLVM 18.1.8 是撰寫本文時最新發布的 LLVM。對於目前主幹,請改用main
)
然後像這樣建構它:
$ cmake -G Ninja -S llvm-project/llvm -B build
-DCMAKE_BUILD_TYPE=Release
-DLLVM_ENABLE_PROJECTS= " clang;lld;clang-tools-extra "
-DLLVM_ENABLE_RUNTIMES=compiler-rt
-DLLVM_TARGETS_TO_BUILD= " WebAssembly;X86;AArch64;ARM;Hexagon;NVPTX;PowerPC;RISCV "
-DLLVM_ENABLE_ASSERTIONS=ON
-DLLVM_ENABLE_EH=ON
-DLLVM_ENABLE_RTTI=ON
-DLLVM_ENABLE_HTTPLIB=OFF
-DLLVM_ENABLE_LIBEDIT=OFF
-DLLVM_ENABLE_LIBXML2=OFF
-DLLVM_ENABLE_TERMINFO=OFF
-DLLVM_ENABLE_ZLIB=OFF
-DLLVM_ENABLE_ZSTD=OFF
-DLLVM_BUILD_32_BITS=OFF
$ cmake --build build
$ cmake --install build --prefix llvm-install
這將在$PWD/llvm-install
中產生一個有效的 LLVM 安裝。稍後我們將此路徑稱為LLVM_ROOT
。不要將此安裝樹與建置樹混淆!
LLVM 需要很長時間來構建,因此上面的命令使用 Ninja 來最大化並行性。如果您選擇省略-G Ninja
,則會產生 Makefiles。在這種情況下,請使用cmake --build build -j NNN
啟用並行性,其中NNN
是平行作業的數量,也就是您擁有的 CPU 數量。
請注意,您必須將clang
和lld
新增至LLVM_ENABLE_PROJECTS
中,且WebAssembly
和X86
必須包含在LLVM_TARGETS_TO_BUILD
中。 LLVM_ENABLE_RUNTIMES=compiler-rt
僅在建立模糊測試時才需要,而clang-tools-extra
僅在您計劃向 Halide 貢獻程式碼時才需要(以便您可以在拉取請求上執行clang-tidy
)。如果您不需要 Python 綁定,可以停用異常處理 (EH) 和 RTTI。我們建議啟用全套以簡化開發過程中的建置。
BuildingHalideWithCMake.md 對此進行了更詳細的討論。建置 Halide 需要 CMake 版本 3.28+。
請按照上述說明建置 LLVM 或取得適當的二進位版本。然後將目錄更改為 Halide 儲存庫並運行:
$ cmake -G Ninja -S . -B build -DCMAKE_BUILD_TYPE=Release -DHalide_LLVM_ROOT= $LLVM_ROOT
$ cmake --build build
如果安裝了適當的系統範圍版本,則不需要設定-DHalide_LLVM_ROOT
。但是,如果您安裝了多個 LLVM,它可以在它們之間進行選擇。
我們建議使用 Visual Studio 2022 進行建置。請務必在 Visual Studio 安裝程式中安裝「適用於 Windows 的 C++ CMake 工具」。對於舊版的 Visual Studio,不要安裝 CMake 工具,而是從各自的專案網站取得 CMake 和 Ninja。
這些說明從D:
驅動器開始。我們假設這個 git repo 被克隆到D:Halide
。我們也假設您的 shell 環境設定正確。對於 64 位元構建,請運行:
D:> "C:Program Files (x86)Microsoft Visual Studio2022CommunityVCAuxiliaryBuildvcvarsall.bat" x64
對於 32 位元構建,請運行:
D:> "C:Program Files (x86)Microsoft Visual Studio2022CommunityVCAuxiliaryBuildvcvarsall.bat" x64_x86
在 Windows 上取得相容依賴項的最佳方法是使用 vcpkg。像這樣安裝:
D:> git clone https://github.com/Microsoft/vcpkg.git
D:> cd vcpkg
D:vcpkg> .bootstrap-vcpkg.bat -disableMetrics
...
CMake projects should use: "-DCMAKE_TOOLCHAIN_FILE=D:/vcpkg/scripts/buildsystems/vcpkg.cmake"
使用工具鏈檔案時,vcpkg 將自動建置所有必要的依賴項。然而,如上所述,請注意,以這種方式取得 LLVM 的建置樹可能會使用超過 100 GB 的磁碟空間,並且建置需要很長時間。您可以隨後手動刪除建置樹,但 vcpkg 不會自動執行此操作。
請參閱 BuildingHalideWithCMake.md 以了解如何使用 Vcpkg 處理 LLVM以外的所有內容。
建立一個單獨的建置樹並使用 vcpkg 的工具鏈呼叫 CMake。這將根據先前執行的環境腳本 ( vcvars
) 以 32 位元或 64 位元建置。
D:Halide> cmake -G Ninja -S . -B build ^
--toolchain D:/vcpkg/scripts/buildsystems/vcpkg.cmake ^
-DCMAKE_BUILD_TYPE=Release
然後運行建置:
D:Halide> cmake --build build
運行所有測試:
D:Halide> ctest --test-dir build --output-on-failure
測試的子集可以使用-L
選擇,包括correctness
、 generator
、 error
以及tests/
下的其他目錄名稱。
如果您想自己建置 LLVM,請按照以下步驟操作。首先,下載 LLVM 的原始程式碼(這些說明使用 18.1.8 版本)。
D:> git clone --depth 1 --branch llvm-org-18.1.8 https://github.com/llvm/llvm-project.git
如上所述,運行vcvarsall.bat
在 x86 和 x64 之間進行選擇。然後使用下列命令配置 LLVM(對於 32 位,請設定-DLLVM_BUILD_32_BITS=ON
):
D:> cmake -G Ninja -S llvm-projectllvm -B build ^
-DCMAKE_BUILD_TYPE=Release ^
-DLLVM_ENABLE_PROJECTS=clang;lld;clang-tools-extra ^
-DLLVM_ENABLE_RUNTIMES=compiler-rt ^
-DLLVM_TARGETS_TO_BUILD=WebAssembly;X86;AArch64;ARM;Hexagon;NVPTX;PowerPC;RISCV ^
-DLLVM_ENABLE_ASSERTIONS=ON ^
-DLLVM_ENABLE_EH=ON ^
-DLLVM_ENABLE_RTTI=ON ^
-DLLVM_ENABLE_HTTPLIB=OFF ^
-DLLVM_ENABLE_LIBEDIT=OFF ^
-DLLVM_ENABLE_LIBXML2=OFF ^
-DLLVM_ENABLE_TERMINFO=OFF ^
-DLLVM_ENABLE_ZLIB=OFF ^
-DLLVM_ENABLE_ZSTD=OFF ^
-DLLVM_BUILD_32_BITS=OFF
MSBuild:如果要使用 MSBuild 而不是 Ninja 建置 LLVM,請使用-G "Visual Studio 17 2022" -Thost=x64 -A x64
或-G "Visual Studio 17 2022" -Thost=x64 -A Win32
取代-G Ninja
。
最後,運行建置並安裝到本地目錄:
D:> cmake --build build --config Release
D:> cmake --install build --prefix llvm-install
如果您想要偵錯版本,可以將上述cmake
指令中的Debug
替換為Release
。
若要將其與 Halide 一起使用,但仍允許 vcpkg 管理其他依賴項,您必須在 Halide 的 CMake 設定命令列中新增兩個標誌。首先,使用-DVCPKG_OVERLAY_PORTS=cmake/vcpkg
停用 LLVM。其次,使用-DHalide_LLVM_ROOT=D:/llvm-install
將 CMake 指向我們新建的 Halide。
做建造機器人所做的事情:https://buildbot.halide-lang.org/master/#/builders
如果最適合您的系統的行是紅色的,那麼也許事情不僅僅對您來說是壞的。如果它是綠色的,那麼您可以點擊最新的構建並查看構建機器人運行的命令。打開一個步驟(“配置 Halide”很有用)並在檢視器中查看“stdio”日誌。這些日誌包含運行的完整命令以及它們運行時使用的環境變數。
警告
我們不提供對 Makefile 的支援。請隨意使用它,但如果出現任何問題,請切換到 CMake 建置。另請注意,Makefile 無法建立 Python 綁定或產生安裝包。
TL;DR :安裝 LLVM 17(或更高版本)並在儲存庫的根目錄(本自述檔案所在的位置)中執行make
。
預設情況下, make
將使用PATH
中找到的llvm-config
工具。如果您想要使用不同的 LLVM,例如按照上述說明自訂的 LLVM,請設定下列環境變數:
$ export LLVM_CONFIG= " $LLVM_ROOT /bin/llvm-config "
現在您應該能夠在 Halide 原始碼樹的根目錄中執行make
了。 make run_tests
將執行 JIT 測試套件,而make test_apps
將確保所有應用程式編譯並執行(但不會檢查其輸出)。
建置測試時,您可以使用HL_TARGET
環境變數設定 AOT 編譯目標。
如果您希望在單獨的目錄中建立 Halide,您可以這樣做:
$ cd ..
$ mkdir halide_build
$ cd halide_build
$ make -f ../Halide/Makefile
HL_JIT_TARGET=...
將設定 Halide 的 JIT 編譯目標。
HL_DEBUG_CODEGEN=1
將列印 Halide 正在編譯的偽代碼。數字越大,列印的細節越多。
HL_NUM_THREADS=...
指定為執行緒池所建立的執行緒數。當使用非同步調度指令時,可能需要並分配比這個數量更多的執行緒。最多允許 256 個線程。 (預設情況下,使用主機上的核心數。)
HL_TRACE_FILE=...
指定要將追蹤資料轉儲到的二進位目標檔案(除非在目標中至少啟用了一項trace_
功能,否則將被忽略)。可以從utils/HalideTraceViz.cpp
中的程式碼開始以程式設計方式解析輸出。
我們在doc/
中有更多文檔,以下連結可能會有所幫助:
文件 | 描述 |
---|---|
CMake建構 | 如何使用 CMake 配置和建置 Halide。 |
CMake包 | 如何使用 Halide CMake 套件建立程式碼。 |
六邊形 | 如何使用 Hexagon 後端。 |
Python | Python 綁定的文檔。 |
潤根 | 如何使用 RunGen 介面來運行和基準測試任意管道。 |
伏爾甘 | 如何使用 Halide Vulkan 後端(測試版) |
網路組裝 | 如何使用 WebAssembly 後端以及如何使用 V8 來取代 wabt。 |
網路GPU | 如何運作 WebGPU 管道(BETA) |
希望向 Halide 貢獻程式碼的開發人員更感興趣的是以下連結:
文件 | 描述 |
---|---|
CMake開發者 | 編寫新 CMake 程式碼的指南。 |
模糊測試 | 有關 Halide 編譯器(而不是管道)模糊測試的資訊。適用於內部開發人員。 |