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 上,只要您位于安装 Halide 的同一虚拟环境中,CMake 的find_package
命令就应该找到 Halide。在 Windows 上,您需要将虚拟环境根目录添加到CMAKE_PREFIX_PATH
。这可以通过在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 编译器(而不是管道)模糊测试的信息。适用于内部开发人员。 |