T_compute와 T_memory
연산의 실행 시간은 크게 두 부분으로 생각할 수 있다.
T_compute: 연산 유닛이 계산하는 데 걸리는 시간
T_memory: HBM에서 데이터를 가져오거나 쓰는 데 걸리는 시간
계산 시간
연산량이 F FLOPs이고, 하드웨어의 peak compute가 C FLOP/s라면:
예를 들어 F = 100 TFLOPs, C = 1,000 TFLOP/s라면:
메모리 시간
메모리 이동량이 M bytes이고, HBM bandwidth가 BW bytes/s라면:
예를 들어 M = 1 TB, BW = 5 TB/s라면:
왜 max를 쓰나
계산과 메모리 이동은 완전히 순서대로만 일어나지 않는다. 좋은 커널은 데이터를 가져오는 동안 일부 계산을 하고, 계산하는 동안 다음 데이터를 준비한다.
그래서 이상적으로는 둘이 겹칠 수 있다.
max는 실제 시간이 아니라 하한이다. 둘 중 더 느린 일보다 빠르게 끝날 수는 없다.
반대로 둘이 전혀 겹치지 못한다고 단순하게 보면:
실제 구현은 보통 이 둘 사이 어딘가에 있다.
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가 더 크면 어떤 병목인가?