VRAM은 GPU가 작업 중인 데이터를 붙잡아 두는 전용 메모리다. 화면에 그릴 프레임 버퍼, 텍스처와 지오메트리, 셰이더 데이터, 연산 중간값이 여기에 올라간다. 외장 그래픽카드는 GDDR이나 HBM을 따로 달고, CPU에 통합된 그래픽은 시스템 메모리를 CPU와 나눠 쓴다.
역할
- 담는 것
- 프레임 버퍼, 텍스처·지오메트리, 셰이더 데이터, 연산 중간값
- 구성
- 외장 카드는 GDDR·HBM, 통합 그래픽은 시스템 메모리를 나눠 쓴다
- 대역폭
- 핀당 전송 속도와 버스 폭의 곱
용량과 트래픽
- 넓은 버스
- 메모리 패키지와 배선·전력이 더 필요하다
- 캐시·압축
- VRAM 트래픽을 줄이지만 데이터에 따라 효과가 다르다
- 용량 부족
- 자원을 밖으로 내보내며 프레임 시간이 흔들린다
- 확인할 것
- 평균 사용량보다 순간 최대치와 실제 데이터 세트 크기를 본다
비교 시 주의
- GDDR
- 핀 속도를 끌어올려 그래픽카드에 맞춘 방식
- HBM
- 인터포저 위 넓은 인터페이스로 대역폭과 전력 효율을 노린다
- 통합 메모리
- 전용 VRAM 용량과 같은 잣대로 비교하면 동작을 잘못 읽는다
메모리 대역폭은 핀 하나가 초당 옮기는 데이터 양과 버스 폭을 곱해서 나온다. 같은 속도의 메모리를 써도 버스가 넓으면 대역폭이 커진다. 대신 넓은 버스는 메모리 패키지를 더 많이 붙여야 하고, 기판에 배선을 깔 공간과 전력도 더 필요하다. GPU 내부 캐시와 메모리 압축은 VRAM까지 오가는 트래픽을 줄여 준다. 다만 압축이 잘 듣는 데이터가 정해져 있어서 모든 접근이 같은 비율로 줄어들지는 않는다.
그래픽 메모리 관리자가 자원 이동을 지원하는 환경에서는 용량이 부족할 때 당장 쓰지 않는 자원을 밖으로 내보내고, 필요할 때 다시 가져올 수 있다. 이때 PCIe 링크와 소프트웨어의 메모리 관리가 끼어들면서 프레임 시간이 들쭉날쭉해지거나 작업 속도가 떨어진다. 그래서 평균 사용량보다 순간 최대치와 실제 데이터 세트 크기를 보는 편이 낫다.
GDDR은 핀 속도를 끌어올려 그래픽카드에 맞춘 방식이고, HBM은 인터포저 위에서 넓은 인터페이스를 확보해 대역폭과 전력 효율을 함께 노린다. 모바일 SoC나 통합 메모리 시스템은 CPU와 GPU가 같은 메모리를 나눠 쓰기 때문에, 전용 VRAM 용량과 같은 잣대로 비교하면 실제 동작을 잘못 읽게 된다.
레지스터·공유 메모리와 VRAM
GPU 스레드가 연산 중 보관하는 레지스터와, 같은 작업 묶음이 재사용하는 온칩 공유 메모리는 보드에 붙은 VRAM과 다른 계층이다. 자주 사용하는 작은 데이터를 가까운 계층에서 재사용하면 VRAM 트래픽을 줄일 수 있지만, 온칩 자원은 용량이 작고 동시에 실행할 작업들과 나누어 쓴다.
용량 부족 때의 동작은 API와 프로그램에 따라 다르다. 운영체제가 일부 자원을 시스템 메모리로 옮기는 경우도 있지만, 연산 프로그램이 메모리 할당 실패로 중단될 수도 있다. 시스템 RAM이 남아 있다고 전용 VRAM 부족을 자동으로 같은 성능으로 보완하지는 못한다.
관련: GPU 병렬 실행 구조, PCI Express, DDR 세대 비교