본문 바로가기

GPU-KERNEL

Register Pressure vs Occupancy Trade-off

CUDA 커널 성능은 단순히 스레드를 많이 띄우는 것이 끝이 아님, 

실제 성능은 레지스터 사용량 register pressure 와 SM 에서 동시에 유지 가능한 워프 개수 occupancy 의 균형에 의해 결정된다.

 

레지스터를 많이 쓰면, 한 스레드가 더 강력해지지만, SM 이 동시에 수용할 수 있는 워프 수가 줄어든다.

레지스터를 적게 쓰면, occupancy 는 올라가지만, 단일 워프의 계산 파이프 라인이 허전해져 연산 밀도가 떨어질 수 있다.

 

레지스터 Pressure

레지스터는 GPU 에서 가장 빠른 저장소, 컴파일러는 레지스터를 스레드마다 독립적으로 할당

레지스터사용량은 다음 요소에 의해 늘어난다

  • 지역 변수 수 
  • Loop unroll 수
  • Tiling 크기
  • 템플릿 인스턴스에 따른 변수 생성
  • 컴파일러가 spill 방지를 위해 잡아두는 내부 변수

핵심 특징

  • 레지스터는 SM 단위로 쿼터가 정해져 있다.
  • SM 레지스터 풀은 모든active warps 가 나눠가진다.
  • 한 워프/블록의 레지스터 요구량이 커지면, 동시에 유지 가능한 블로/워프 수가 줄어든다.

 

Occupancy 란 무엇인가

Occupancy = Active Warps / Max Warps

더 많은 워프가 스케줄러 큐에 올라 있음

메모리 대기를 다른 워프가 채워줄 수 있음

warp-level pipeline stall 완화

컴퓨팅 밀도가 높은 동안은 occupancy 가 낮아도 고성능이 나올 수 있다.

 

실제 high-end kernel 들은 대체로 64 ~ 128 개 레지스터, 30~50% occupancy 에서 peak 에 도달