CUDA matmul 커널을 cuBLAS와 같은 성능으로 최적화하는 방법 (2022)
- CUDA에서 직접 매트릭스 곱셈 구현을 정리를 통해 최적화.
- 최종 목표는 현대 딥러닝에 사용되는 GPU의 성능 특성을 깊이 이해하기.
- 긴밀한 글로벌 메모리 접근, 공유 메모리 캐싱, 차지율 최적화 등을 다룸.
- 모든 커널의 코드는 GitHub에서 다운로드 가능.
- 핵심 성능은 행렬 곱셈 (SGEMM)에서 나타남.
- 간단한 가법 커널에서 시작해 점진적으로 최적화 진행.
- cuBLAS 성능의 95% 초과를 목표로 함.
각 커널 성능
- 나이브 커널: 309.0 GFLOPs/s (1.3%)
- GMEM Coalescing: 1986.5 GFLOPs/s (8.5%)
- SMEM Caching: 2980.3 GFLOPs/s (12.8%)
- 1D Blocktiling: 8474.7 GFLOPs/s (36.5%)
- 2D Blocktiling: 15971.7 GFLOPs/s (68.7%)
- Vectorized Mem Access: 18237.3 GFLOPs/s (78.4%)
- Auto-tuning: 19721.0 GFLOPs/s (84.8%)
- Warptiling: 21779.3 GFLOPs/s (93.7%)
주요 내역 요약
- Kernel 1: 나이브 구현: 단순한 행렬 곱셈, 글로벌 메모리 비응집적 접근.
- Kernel 2: 글로벌 메모리 응집화: 워프의 개념 소개, 메모리 접근을 응집화하여 성능 향상.
- Kernel 3: 공유 메모리 캐싱: 고속 온칩 메모리를 사용하여 반복되는 데이터를 캐싱.
- Kernel 4: 1D Blocktiling: 각 스레드가 더 많은 결과를 계산하도록 변경하여 메모리 액세스 감소.
- Kernel 5: 2D Blocktiling: 8*8 블록 크기로 확장하여 계산량 증가, 메모리 액세스 최적화.
- Kernel 6: 메모리 액세스 벡터화: SMEM 및 GMEM 접근 벡터화, 더 빠른 데이터 로드.
- Auto-tuning: 매개변수를 조정하여 최적의 성능을 찾는 과정을 포함함.
결론
- 성능 최적화는 메모리 액세스 패턴의 개선을 통해 가능.
- 각 스레드가 더 많은 계산을 수행하도록 최적화하여 계산 집약도를 높임.
- 공유 메모리의 올바른 사용법과 접근 패턴은 성능 향상에 크게 기여.
- 벡터화와 자동 튜닝은 최종 성능 최적화의 핵심.
4siboehm.com링크 복사하기
AI 뉴스 요약은 뉴스의 내용을 AI가 요약(GPT-4 활용)한 것입니다. 따라서 틀린 내용을 포함할 수 있습니다. 뉴스의 자세한 내용을 확인하시려면 해당 뉴스 링크를 클릭해주세요.