Halide는 최신 기계에서 고성능 이미지 및 배열 처리 코드를 더 쉽게 작성할 수 있도록 설계된 프로그래밍 언어입니다. Halide의 현재 목표는 다음과 같습니다.
Halide는 독립형 프로그래밍 언어가 아닌 C++에 내장되어 있습니다. 이는 Halide의 C++ API를 사용하여 Halide 파이프라인의 메모리 내 표현을 구축하는 C++ 코드를 작성한다는 의미입니다. 그런 다음 이 표현을 개체 파일로 컴파일하거나 JIT 컴파일하여 동일한 프로세스에서 실행할 수 있습니다. Halide는 C++ 없이 Python에 내장된 Halide 작성을 완벽하게 지원하는 Python 바인딩도 제공합니다.
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의 find_package
명령은 Halide를 설치한 것과 동일한 가상 환경에 있는 한 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 릴리스는 Apple Clang 500.2.76과 함께 XCode의 명령줄 도구를 사용하여 구축되었습니다. 이는 libstdc++ 대신 libc++에 대해 링크한다는 의미입니다. 기본적으로 libc++가 아닌 이전 XCode를 사용하는 경우 이에 따라 컴파일러 옵션을 조정해야 할 수도 있습니다.
우리는 최신 Ubuntu LTS를 사용하여 Linux 릴리스를 빌드합니다. 배포판이 너무 오래된 경우 필수 glibc가 없을 수 있습니다.
CI에서 사용하는 Halide 및 LLVM 버전의 Nightly 빌드도 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 컴파일러 라이브러리를 구축하고 실행하기 위해 테스트된 호스트 도구 체인 및 플랫폼 조합입니다.
컴파일러 | 버전 | OS | 아키텍처 |
---|---|---|---|
GCC | 9.5 | 우분투 리눅스 20.04 LTS | x86, x64 |
GCC | 11.4 | 우분투 리눅스 22.04 LTS | ARM32, ARM64 |
MSVC | 2022년(19.37) | 윈도우 11(22631) | x86, x64 |
애플클랭 | 15.0.0 | 맥OS 14.4.1 | x64 |
애플클랭 | 14.0.0 | 맥OS 14.6 | ARM64 |
일부 사용자는 Clang 9.0.0 이상을 사용하여 Linux용, ClangCL 11.0.0 이상을 사용하여 Windows용, MSVC와의 크로스 컴파일을 통해 Windows ARM64용 Halide를 성공적으로 구축했습니다. 그러나 우리는 이러한 시나리오를 적극적으로 테스트하지 않으므로 귀하의 마일리지가 다를 수 있습니다.
이 외에도 우리는 원래 공급업체로부터 여전히 적극적인 자사 공개 지원을 받는 플랫폼 및 도구 체인 조합을 지원(PR을 수락함으로써)할 의향이 있습니다. 예를 들어, 이 글을 쓰는 시점에는 Windows 7이 제외되고 Ubuntu 18.04 LTS가 포함됩니다.
컴파일된 AOT 파이프라인은 훨씬 더 광범위한 플랫폼 지원을 제공할 것으로 예상됩니다. 바이너리는 C ABI를 사용하며 호환되는 모든 C 컴파일러는 생성된 헤더를 올바르게 사용할 수 있을 것으로 기대합니다. C++ 바인딩에는 현재 C++17이 필요합니다. 생성된 파이프라인과의 호환성 문제를 발견한 경우 문제를 열어주세요.
언제든지 Halide를 구축하려면 최신 안정 버전의 LLVM, 이전 안정 버전의 LLVM 또는 트렁크가 필요합니다. 이는 작성 당시 버전 19, 18, 17이 지원되지만 16은 지원되지 않음을 의미합니다.
Homebrew를 사용하여 macOS에서 LLVM의 바이너리 릴리스를 얻는 것이 가장 간단합니다. brew install llvm
실행하세요. Linux의 Debian 버전에서는 LLVM APT 저장소가 가장 좋습니다. 제공된 설치 스크립트를 사용하십시오. Windows에 적합한 공식 바이너리 릴리스는 없지만 CI에서 사용하는 릴리스는 일반적으로 테스트된 다른 플랫폼용 tarball과 함께 https://buildbot.halide-lang.org에서 찾을 수 있습니다. 자세한 내용은 아래 Windows 섹션을 참조하세요.
OS에 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
생략하기로 선택하면 Makefile이 대신 생성됩니다. 이 경우 cmake --build build -j NNN
사용하여 병렬 처리를 활성화합니다. 여기서 NNN
은 병렬 작업 수, 즉 보유한 CPU 수입니다.
LLVM_ENABLE_PROJECTS
및 WebAssembly
에 clang
및 lld
추가 해야 하며 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
에 복제되었다고 가정합니다. 또한 쉘 환경이 올바르게 설정되었다고 가정합니다. 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을 획득하면 빌드 트리에 100GB 이상의 디스크 공간을 사용할 수 있으며 빌드하는 데 매우 오랜 시간이 걸릴 수 있습니다. 나중에 빌드 트리를 수동으로 삭제할 수 있지만 vcpkg는 이 작업을 자동으로 수행하지 않습니다.
LLVM을 제외한 모든 항목에 Vcpkg를 사용하는 방법에 대한 지침은 BuildingHalideWithCMake.md를 참조하세요.
별도의 빌드 트리를 만들고 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
사용하여 선택할 수 있으며 tests/
아래에 correctness
, generator
, error
및 기타 디렉터리 이름이 포함됩니다.
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: Ninja 대신 MSBuild를 사용하여 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
사용하여 새로 빌드된 Halide를 CMake에 지정합니다.
빌드봇이 하는 일을 하세요: https://buildbot.halide-lang.org/master/#/builders
귀하의 시스템과 가장 잘 일치하는 행이 빨간색이라면 상황이 단순히 손상된 것이 아닐 수도 있습니다. 녹색이면 최신 빌드를 클릭하여 빌드 봇이 실행하는 명령을 확인할 수 있습니다. 단계를 열고("Halide 구성"이 유용함) 뷰어에서 "stdio" 로그를 살펴보세요. 이러한 로그에는 실행된 전체 명령과 함께 실행된 환경 변수가 포함되어 있습니다.
경고
우리는 Makefile에 대한 지원을 제공하지 않습니다. 자유롭게 사용해도 되지만, 문제가 발생하면 CMake 빌드로 전환하세요. 또한 Makefile은 Python 바인딩을 빌드하거나 설치 패키지를 생성할 수 없습니다.
핵심요약 : LLVM 17(또는 그 이상)을 설치하고 저장소의 루트 디렉터리(이 README가 있는 곳)에서 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 바인딩에 대한 문서입니다. |
RunGen | RunGen 인터페이스를 사용하여 임의 파이프라인을 실행하고 벤치마킹하는 방법. |
불칸 | Halide Vulkan 백엔드(베타)를 사용하는 방법 |
웹어셈블리 | WebAssembly 백엔드를 사용하는 방법과 wabt 대신 V8을 사용하는 방법. |
웹GPU | WebGPU 파이프라인 실행 방법(베타) |
다음 링크는 Halide에 코드를 기여하려는 개발자에게 더 큰 관심을 가질 것입니다.
문서 | 설명 |
---|---|
CMake 개발자 | 새로운 CMake 코드 작성을 위한 지침. |
FuzzTesting | 파이프라인이 아닌 Halide 컴파일러의 퍼지 테스트에 대한 정보입니다. 내부 개발자를 위한 것입니다. |