Register?
GPU thread 가 직접 사용하는 초고속 작업 공간, 모든 연산은 반드시 레지스터에 올라온 값으로 수행, 연산 결과 역시 register 에 저장된다.
- 스레드 전용 공간
- GPU 메모리 계층 중 가장 빠름
- 연산자와 직접 연결됨
- shared/global memory 값을 그대로 연산에 사용할 수 없으며 반드시 레지스터로 로드해야함
메모리에서 오는 모든 값은 레지스터를 거치고
메모리로 저장하는 모든 값도레지스터에서 나간다
내부 연산은 100% 레지스터 기반
메모리 간 direct copy 는 존재하지 않음, 항상 레지스터가 경우
register 는 GPU SM 내 제한된 자원, 사용량이 많아지면 다음을 초래
- occupancy 감소
- warp 수 감소로 latency hiding 능력 저하
- register spill 발생 시 local memory 접근으로 성능 급락
레지스터의 역할 정리
- 연산자와 연결됨 유일한 operand 공간
- 모든 연산의 입력/출력 단위
- 메모리로부터 값을 로드한 후 연산을 수행하는 필수 단계
shared memory 는 연산장소가 아님, register 로 데이터를 빠르게 공급하기 위한 캐시 역할
연산은 항상 register 에서만 진행,
shared memory 는 register 의 일이 아닌, register 가 기다리는 시간을 줄여줌
레지스터의 용량 제한 - SM 단위
GPU 한 개에는 여러 개의 SM, Streaming Multiprocessor 가 있고,
각 SM 안에 레지스터 파일, register file 이 고정 크기로 존재한다.
스레드당 레지스터 사용량이 가장 중요한 이유
각 thread 는 커널을 실행하면서 필요한 만큼 레지스터를 쓰는데, 컴파일러가 결정한 thread 당 레지스터 개수가 많아지면
한 warp 이 필요한 레지스터
SM 전체 레지스터 용량이 고정이기 때문에, 많은 레지스터를 쓰는 커널은 동시에 실행 가능한 warp 수가 줄어듦
즉, 레지스터를 많이 쓰는 커널은
occupancy 낮아짐, latency hiding 능력 감소, 성능 저하
커널 최적화에서 체크해야 하는 항목
ptxas info : Used XX registers
스레드당 더 적은 레지스터 사용하면,
warp 많아짐, 더 많은 parallelism, 더 나은 latency hiding, 더 높은 성능
스레드당 레지스터 요구량이 너무 많아지면
spill -> local memory (global memory!)
즉, 레지스터에 못 넣는 임시 값들을 글로벌 메모리로 젖아한다.
그래서 커널 최적화 - tile 크기 조절, frangment 크기 줄이기 등으로 레지스터 사용량을 최적화해야한다.
'GPU-KERNEL' 카테고리의 다른 글
| Register Pressure vs Occupancy Trade-off (0) | 2025.11.22 |
|---|---|
| register 추가 개념, 얼마나 할당되는지 (중요한건 컴파일러의 역할) (0) | 2025.11.22 |
| 두 가지 커널 성능 측정 방식 - "벤치마크용" vs "프로파일용" (0) | 2025.11.20 |
| 커널 내부에서의 sharedmemory 선언 이유, 커널은 그리드 전체에 대응되는 느낌임! (0) | 2025.11.20 |
| cudaGetDeviceProperties - 3080ti laptop (0) | 2025.11.20 |