본문 바로가기

GPU-KERNEL

register 추가 개념, 얼마나 할당되는지 (중요한건 컴파일러의 역할)

변수 선언 수가 아닌, 동시에 살아있는 값 live values 개수가 레지스터 수를 결정한다.

변수를 재사용하거나, 범위가 바로 끝나는 경우 효율적

사용하지 않는 변수의 live range 가 끊기지 않으면 비효율적

 

레지스터는 정적 수량이 아닌, 각 스레드에서 동시에 살아 있는 값의 개수를 기준으로 컴파일러가 계산

 

기본적인 레지스터 관리는 컴파일러가 대부분 잘한다.

변수의 live range 분석해서 자동으로 레지스터 재사용

최적화된 SSA 기반 레지스터 할당

 

가장 중요한 것은 동시에 살아 있는 데이터  

변수 개수가 아닌 다음 항목에 의해 결정

동시에 hold 해야 하는 값의 개수

liveness 가 커지는 구조는 따로 존재

한 스레드가 너무 큰 타일을 누산

너무 aggressive 한 unroll, 중간값 많음

큰 구조체를 그대로 인라인

shared memory 없이 local 에 큰 배열 생성

 

일반적인 연산 커널 구현에서 레지스터 효율 관련 고민은 ↓

 

실제 커널 개발자가 신경 써야 하는 순간

성능 임계치에 가까운 경우

GEMM, softmax-fusion, large-tile convolution 등

타일 크기, fragment shape 등을 수동 튜닝

 

occupancy 제약이 성능에 직접 영향

 메모리 latency hiding 이 중요한 커널