GPU 캐시 계층 구조의 구성과 역할
GPU는 CPU보다 훨씬 많은 연산 유닛을 가지지만,
모든 코어가 메모리에 동시에 접근하면 병목이 발생한다.
이를 방지하기 위해 GPU는 다층 캐시 구조를 사용한다.
가장 가까운 L1 캐시는 코어 그룹(SM, Shader Multiprocessor) 단위로 분리되어 있으며,
L2 캐시는 GPU 전체가 공유한다.
L1 캐시는 낮은 지연(latency) 대신 용량이 작고,
L2 캐시는 비교적 느리지만 대용량 데이터를 보관한다.
이 두 계층의 균형이 GPU의 성능을 결정한다.
L1은 반복 접근되는 로컬 데이터를,
L2는 스트리밍 자산이나 텍스처 데이터를 담당한다.
또한 최신 GPU는 “Coherent Cache Architecture”를 채택해
Compute와 Graphics 파이프라인 간 캐시 일관성을 유지한다.
이 구조 덕분에 두 파이프라인이 같은 데이터를 공유할 때
불필요한 복사나 재로드가 발생하지 않는다.
GPU 내부에는 수십 개의 L1 캐시가 병렬로 존재한다.
각 캐시는 자체 정책을 가지고 데이터 교체를 수행한다.
예를 들어, 한 셰이더 클러스터가 접근한 데이터를
다른 클러스터는 즉시 사용할 수 없다.
따라서 GPU는 L1 캐시와 L2 캐시 간의 일관성(Coherency)을
하드웨어 수준에서 유지해야 한다.
이 구조 덕분에 여러 스레드가 동시에 메모리를 요청해도
데이터 충돌 없이 연산이 진행된다.
실제 게임 엔진에서는 텍스처 샘플링, 버텍스 버퍼 접근 등
대량의 메모리 요청이 발생하지만,
캐시 계층 덕분에 전체 처리 속도가 유지된다.
메모리 접근 패턴 최적화와 캐시 효율 향상
GPU의 메모리 접근은 대부분 “SIMT(Single Instruction, Multiple Thread)” 방식으로 이루어진다.
즉, 여러 스레드가 동시에 같은 명령을 수행하지만,
각 스레드가 다른 데이터를 읽을 수 있다.
이때 데이터 접근 패턴이 비연속적이면 캐시 효율이 급격히 떨어진다.
이를 방지하기 위한 것이 메모리 접근 최적화(Memory Access Optimization)다.
대표적인 기법으로는 **Coalesced Access**가 있다.
이는 여러 스레드의 메모리 요청을 하나의 큰 블록으로 묶어
연속적인 데이터로 변환하는 방식이다.
예를 들어, 32개의 스레드가 32바이트씩 분산 접근하던 것을
GPU가 한 번의 1KB 연속 접근으로 변환한다.
이 덕분에 L1 캐시 미스율이 감소하고,
전체 대역폭 활용률이 향상된다.
또한 GPU는 텍스처 샘플링 시 공간적 지역성(spatial locality)을 활용한다.
인접한 픽셀의 텍스처 좌표가 유사하다는 특성을 이용해
하나의 캐시 라인에 여러 픽셀 데이터를 저장한다.
이 방식은 2D 이미지 처리뿐 아니라,
볼륨 렌더링·GI(Global Illumination)에도 유효하다.
메모리 접근 최적화는 하드웨어만으로 해결되지 않는다.
셰이더 코드의 데이터 배열 구조(Layout)도 큰 영향을 미친다.
GPU는 “Structure of Arrays(SoA)” 방식의 메모리 구조를 선호한다.
이는 데이터를 연속된 메모리에 배치하여,
병렬 접근 시 불필요한 캐시 미스를 방지한다.
반면 “Array of Structures(AoS)” 구조는 비연속적 접근을 유발해 성능 저하가 크다.
이 때문에 그래픽 프로그래머는 셰이더 설계 시
데이터 배치와 정렬을 세밀히 제어해야 한다.
간단한 구조 변경만으로도 20~30%의 캐시 효율 향상이 가능하다.
L1·L2 캐시 효율 향상 알고리즘의 구조적 접근
GPU는 단순히 캐시를 사용하는 수준을 넘어,
캐시 효율을 예측하고 스스로 최적화하는 알고리즘을 내장하고 있다.
이를 Adaptive Cache Management라 한다.
이 알고리즘은 캐시 접근 패턴을 분석해
교체 정책(Replacement Policy)을 실시간 조정한다.
대표적인 교체 정책은 LRU(Least Recently Used)지만,
GPU는 LRU만으로는 충분하지 않다.
대량의 병렬 스레드가 동시에 접근하므로,
자주 사용되는 데이터가 아닌
“가까운 시점에 다시 사용될 데이터”를 예측해야 한다.
이를 위해 GPU는 **Temporal Reuse Prediction** 알고리즘을 사용한다.
L1 캐시는 워프 단위의 지역성을 추적하고,
L2 캐시는 전체 프레임의 시간적 패턴을 분석한다.
결과적으로 GPU는 각 프레임마다 캐시 정책을 자동 변경해
실시간 작업 부하에 최적화된 상태를 유지한다.
이 알고리즘은 하드웨어 레벨에서 완전 자동으로 동작하지만,
엔진 개발자는 이를 보조하기 위해 “Cache Hint” 명령을 활용할 수 있다.
이는 특정 데이터의 사용 빈도나 우선순위를 GPU에 전달해
캐시 정책이 더 정확히 작동하도록 돕는다.
결국 GPU의 캐시 효율은 단일 하드웨어 기능이 아니라
스케줄링, 데이터 구조, 예측 알고리즘이 복합적으로 작용한 결과다.
이러한 계층적 접근 덕분에 GPU는
막대한 병렬 연산 속에서도 일정한 성능과 안정성을 유지할 수 있다.