본문 바로가기

GPU-KERNEL

l1_l2_temporal_locality_test

메모리 접근 패턴이 L1/L2 캐시 활용도에 미치는 영향을 CUDA 커널에서 비교

동일한 연산량과 동일한 데이터 크기를 사용, 접근 패턴만 다른 두 커널을 실행해 시간 차이가 얼마나 발생하는지 측정한다.

두 가지 테스트 커널

1. streaming Pattern

매우 큰 stride 로 계속 먼 주소 접근

동일 cache line 재사용률 낮음

2. Hot Reuse Pattern

thread group 별로 작은 hot region 안에서 반복 접근

동일 cache line 이 L1/L2 에 올라온 뒤 여러 번 재사용됨 , 높은 cache 활용

 

temporal locality 가 실제 PGU 성능에 미치는 영향은 정량적으로 보여준다.

 

실험 환경 및 파라미터

GPU Memory Size 전체 데이터 64MB (float 16,777,216개)
block size 256 threads
grid size 65536 blocks
iters 256
streaming stride 4096 elements (16KB)
hot region size 4096 elements (16KB)
GPU architecture sm_86 (Ampere)

핵심 포인트

  • N = 64MB 는 L2 캐시보다 큰 크기 - 전체 데이터는 캐시에 올릴 수 없음
  • hot_span = 16KB 는 L1 캐시 크기에 잘 들어가는 수준 - 재사용 패턴에서는 L1/L2 에 쉽게 상주 가능
  • stride = 4096 역시 16KB 간격이라 streaming 패턴은 L1/L2 에 걸리더라도 다음 접근 시 다른 line

 

각 패턴의 메모리 특성 분석

streaming pattern

tid → tid + stride → tid + 2*stride → ...
(단 stride = 4096 elements ≈ 16KB)

매번 전혀 다른 cache line 을 읽게 됨

warp 단위로도 coalescing 이 유지되지 않음

l1/l2 hit 율이 낮을 가능성이 매우 높음 - 대부분 DRAM load

DRAM bandwidth 가 bottleneck 이 되는 구조

 

Hot Reuse Pattern

각 그룹은 base~base+4096 범위 내에서 계속 반복 접근
(working set = 16KB)

working set 이 L1 에 올려두기에 충분히 작다

접근 패턴이 hot region 내부에서만 반복적으로 이루어짐

cache line 이 한 번 올라오면 여러 번 읽힘

 

순수항 메모리 계층 활용도 차이만 존재

[streaming] avg time: 28.3621 ms
[hot_reuse] avg time: 20.8155 ms

 

지금의 hot_reuse 는 타일링을 매우 단순화한 형태

타일 내 재사용이 많기 때문에 성능이 올라간다! - 타일링 원리와 동일