T_compute와 T_memory

performanceroofline

연산의 실행 시간은 크게 두 부분으로 생각할 수 있다.

T_compute: 연산 유닛이 계산하는 데 걸리는 시간
T_memory: HBM에서 데이터를 가져오거나 쓰는 데 걸리는 시간

계산 시간

연산량이 F FLOPs이고, 하드웨어의 peak compute가 C FLOP/s라면:

Tcompute=FCT_\text{compute} = \frac{F}{C}

예를 들어 F = 100 TFLOPs, C = 1,000 TFLOP/s라면:

Tcompute=0.1sT_\text{compute} = 0.1s

메모리 시간

메모리 이동량이 M bytes이고, HBM bandwidth가 BW bytes/s라면:

Tmemory=MBWT_\text{memory} = \frac{M}{BW}

예를 들어 M = 1 TB, BW = 5 TB/s라면:

Tmemory=0.2sT_\text{memory} = 0.2s

왜 max를 쓰나

계산과 메모리 이동은 완전히 순서대로만 일어나지 않는다. 좋은 커널은 데이터를 가져오는 동안 일부 계산을 하고, 계산하는 동안 다음 데이터를 준비한다.

그래서 이상적으로는 둘이 겹칠 수 있다.

Tactualmax(Tcompute,Tmemory)T_\text{actual} \ge \max(T_\text{compute}, T_\text{memory})

max는 실제 시간이 아니라 하한이다. 둘 중 더 느린 일보다 빠르게 끝날 수는 없다.

반대로 둘이 전혀 겹치지 못한다고 단순하게 보면:

TactualTcompute+TmemoryT_\text{actual} \approx T_\text{compute} + T_\text{memory}

실제 구현은 보통 이 둘 사이 어딘가에 있다.

max(T_compute, T_memory) <= T_actual

단순 모델에서는 T_compute + T_memory를 no-overlap 추정치로 볼 수 있다.

병목 판단

둘 중 어떤 시간이 더 큰지 보면 병목을 알 수 있다.

T_compute > T_memory  -> compute-bound
T_memory > T_compute  -> memory-bound

이 비교를 부등식으로 정리하면 arithmetic-intensity가 나온다.

확인

  • max(T_compute, T_memory)가 실제 시간이 아니라 하한인 이유는 무엇인가?
  • 계산과 메모리 이동이 전혀 겹치지 않으면 어떤 식으로 시간을 추정할 수 있는가?
  • T_memory가 더 크면 어떤 병목인가?