본문 바로가기

dev_AI_framework

Header-only 템플릿 라이브러리 - CUTLASS

1. Header-only

  • 보통의 라이브러리는 .h (선언) + .cpp/.cu (구현) 파일로 나뉘고, 빌드하면 .a (static lib) 이나 .so/.dll (shared lib) 파일을 만들어서 링크
  • 그런데 header-only 라이브러리는 .h(.hpp/.cuh) 파일에 구현 코드까지 전부 들어있다.
  • 따라서 사용자는 CUTLASS 를 별도 컴파일/링크할 라이브러리로 빌드하지 않고, 자기 프로젝트에서 #include <cutlass/...> 만 하면 된다.
  • CUDA 코드라서 nvcc 가 인클루드 시점에 템플릿들을 컴파일해준다.

즉, 따로 .so 나 .a 를 배포하거나 링크하지 않아도 된다는 의미

 

2. 템플릿 라이브러리

  • CUTLASS 는 거의 모든 기능이 C++ 템플릿으로 되어 있다. 
  • cutlass::gemm::device::Gemm<...> 같은 식으로, 행렬 레이아웃, 데이터 타입, 타일 크기, 에필로그 functor 등을 템플릿 인자로 전달.
  • 이런 템플릿은 컴파일 타임에 실제 코드로 인스턴스화된다.
  • 특정 GEMM 조합을 쓰고 싶으면, 그에 맞는 템플릿을 인스턴스화하는 코드만 작성하면 된다. 필요한 커널만 코드 생성이 되고, 나머지는 빌드 결과에 포함되지 않는다.

즉, CUTLASS 는 컴파일 타임 커스터마이즈를 위한 설계라서, 모든 구현이 템플릿 코드로 header 에 들어있다.

 

3. 의미와 장단점

장점

  • 유연성 극대화 : 데이터 타입, 매트릭스 레이아웃, tile 크기, 에필로그 연산까지 전부 조합 가능
  • 성능 최적화 : 템플릿이므로 인라이닝, 상수 전파가 잘 되어 성능 최적화가 용이
  • 빌드 단순화 : 별도 .so 링크 필요 없음 -> 그냥 include 하면 끝

단점

  • 컴파일 시간이 길다 : 템플릿 인스턴스가 많아질수록 빌드가 무거워짐
  • 바이너리 크기 증가 위험 : 필요 이상의 조합을 많이 인스턴스화하면 코드 사이즈 폭증
  • ABI 안정성 부족 : precompiled 라이브러리처럼 "버전 안정 ABI" 가 없고, 항상 소스 레벨에서 컴파일해야 함