NVIDIA/cuda-tile

CUDA Tile IR is an MLIR-based intermediate representation and compiler infrastructure for CUDA kernel optimization, focusing on tile-based computation patterns and optimizations targeting NVIDIA tensor core units.

NVIDIA / cuda‑tile – CUDA Tile IR

무엇인가요

  • MLIR/LLVM 위에 구축된 오픈소스 컴파일러 인프라로, 새로운 CUDA Tile dialect를 도입합니다.
  • 이 다이얼렉트는 NVIDIA GPU(특히 Tensor-Core 유닛)에 효율적으로 매핑되는 타일 기반 계산 패턴을 표현합니다.
  • 다음을 포함합니다:
    • MLIR 다이얼렉트 (타일된 텐서, 포인터 등에 대한 연산 및 타입)
    • IR을 프로그래밍적으로 구성하고 변환하기 위한 Python 바인딩
    • 바이너리 bytecode 형식과 MLIR 텍스트, bytecode, 최종 GPU 바이너리(cubin) 간 변환 도구
    • 컨플라이언스 테스트 스위트.

왜 중요한가요

  • 타일링은 고성능 커널(행렬 곱셈, 컨볼루션 등)의 핵심 최적화입니다. CUDA Tile은 일급 추상화를 제공함으로써 개발자가 고수준에서 커널을 작성하면서도 수동 최적화된 CUDA의 성능에 도달할 수 있도록 합니다.
  • CUDA Toolkit 13.1 릴리스와 통합되어 있어 생성된 코드를 일반 CUDA 드라이버 API로 실행할 수 있습니다.

주요 구성 요소

구성 요소 목적
CUDA Tile Dialect GPU 메모리 계층과 Tensor-Core 사용을 고려한 tile<…> 타입, load_ptr_tko, print_tko, reshape, broadcast 등의 연산을 정의하는 MLIR 다이얼렉트.
Python 바인딩 C++를 작성하지 않고도 스크립트로 Tile IR을 구축, 검사, 변환 패스를 실행할 수 있게 합니다.
Bytecode 컴팩트한 바이너리 표현(.tilebc)으로, CUDA 드라이버에 의해 JIT 컴파일되거나 tileiras로 AOT 컴파일되어 cubin으로 변환될 수 있습니다.
테스트 스위트 LLVM‑lit 기반 테스트로 다이얼렉트 의미와 엔드투엔드 컴파일 흐름을 검증합니다.

일반적인 워크플로우

  1. 작성: CUDA Tile 다이얼렉트를 사용하여 MLIR로 커널을 작성합니다(README 예제 참조).
  2. 변환: cuda-tile-translate로 bytecode로 변환합니다.
  3. 컴파일: bytecode를 cubin으로 컴파일합니다(tileiras) 또는 런타임에 직접 bytecode를 로드합니다. 드라이버가 JIT 컴파일합니다.
  4. 실행: CUDA 드라이버 API(또는 런타임 API)를 통해 호스트 프로그램에서 커널을 시작합니다.

빌드 및 설치

  • CMake ≥ 3.20, C++17 컴파일러, Python ≥ 3.6, 그리고 호환 가능한 LLVM/MLIR 체크아웃이 필요합니다(정확한 커밋은 cmake/IncludeLLVM.cmake에 고정되어 있습니다).
  • LLVM 제공 방법 3가지:
    1. CMake가 자동으로 올바른 LLVM 소스를 다운로드합니다(느리지만 가장 간단).
    2. CMake에 로컬 LLVM 소스 트리 경로를 지정합니다.
    3. 미리 빌드된 LLVM 설치에 링크합니다(파이썬 API가 필요한 경우 -DMLIR_ENABLE_BINDINGS_PYTHON=ON으로 빌드되어야 함).
  • 선택적 플래그:
    • -DCUDA_TILE_ENABLE_BINDINGS_PYTHON=ON – 파이썬 API 빌드.
    • -DCUDA_TILE_ENABLE_TESTING=ON – lit 테스트 스위트 빌드 및 실행.
    • -DCUDA_TILE_ENABLE_CCACHE=ON – 재컴파일 속도 향상.

예제 (README에서)

# 라이브러리 및 도구 빌드
cmake -G Ninja -S . -B build \
  -DCMAKE_BUILD_TYPE=Release \
  -DCUDA_TILE_ENABLE_BINDINGS_PYTHON=ON \
  -DCUDA_TILE_ENABLE_TESTING=ON
cmake --build build

# MLIR 파일을 bytecode로 변환
cuda-tile-translate example.mlir \
  --bytecode-version=13.1 \
  --mlir-to-cudatilebc --no-implicit-module -o example.tilebc

# AOT로 cubin에 컴파일 (sm_100을 GPU 아키텍처로 교체)
 tileiras --gpu-name sm_100 example.tilebc -o example.cubin

# cubin을 로드하는 호스트 프로그램 컴파일 및 실행
 g++ example_host.cpp -o example -I/usr/local/cuda/include \
   -L/usr/local/cuda/lib64 -lcuda
 ./example

이 프로그램은 데이터 배열을 출력하여 Tile IR 소스에서 GPU 실행까지의 완전한 엔드투엔드 경로를 보여줍니다.

사용 사례

  • 딥러닝 연산자용 커스텀 커널을 구축하는 연구자로, Tensor-Core를 활용해야 하는 경우.
  • 재사용 가능한 고수준 타일 알고리즘 표현을 원하면서도 저수준 CUDA를 생성할 수 있는 성능 엔지니어.
  • MLIR에 GPU 전용 패스를 확장하는 도구 개발자; CUDA Tile은 구체적인 다이얼렉트와 테스트 허브를 제공합니다.

버전 관리 및 호환성

  • 오픈소스 버전은 CUDA Toolkit 버전(13.1.x)과 일치합니다. 패치 번호는 오픈소스 코드 자체의 릴리스를 추적합니다.
  • 각 릴리스는 특정 LLVM 커밋 범위에 연결되어 있으며, 헬퍼 스크립트(scripts/get-cuda-tile-version-for-llvm-hash.sh)는 주어진 LLVM 리비전에 적합한 CUDA Tile 태그를 선택하는 데 도움을 줍니다.

기여 모델

  • 프로젝트는 Apache‑2.0 with LLVM exceptions 라이선스 하에 오픈소스이지만, README는 외부 기여는 현재는 수락하지 않습니다라고 명시하고 있습니다. 버그나 피드백은 이슈를 제출하도록 권장합니다.

결론: CUDA Tile은 MLIR 다이얼렉트를 통해 타일화된 GPU 커널을 기술하고 최적화할 수 있는 진정한 생산 수준의 컴파일러 스택이며, 변환, 테스트, 기존 CUDA 워크플로우에의 통합을 위한 완전한 도구 체인을 갖추고 있습니다.

관련

  • 프로젝트
  • 프로젝트
  • 프로젝트
  • 프로젝트
  • 프로젝트