계산기는 빠른데 왜 기다릴까: Roofline으로 보는 HBM의 역할
요리사가 많아도 재료가 도착하지 않으면
주방에 빠른 요리사를 더 배치했는데 식재료가 좁은 문으로 조금씩 들어온다면, 주문 처리량은 기대만큼 늘지 않는다. 반대로 재료가 넘쳐도 조리할 사람이 부족하면 문을 넓히는 효과가 작다. 프로세서의 연산 장치와 메모리 사이에도 이런 관계가 있다.
칩의 최대 연산 성능은 연산기에 일이 충분히 공급될 때의 처리 능력이다. 실제 프로그램은 데이터를 읽고 결과를 쓰며, 같은 데이터를 얼마나 재사용하는지에 따라 필요한 운반량이 달라진다. Roofline은 연산 능력과 데이터 공급 능력을 함께 놓고 성능의 상한을 보는 모형이다. Williams·Waterman·Patterson의 원 연구, §3
바이트 하나를 가져와 몇 번 계산하는가
이를 수치로 나타내는 것이 산술집약도다. 여기서는 HBM 같은 주메모리와 칩 사이의 전송을 기준으로 삼자.
I = F / Q
F는 수행한 부동소수점 연산 수, Q는 그 메모리 경계를 실제로 오간 바이트 수다. I의 단위는 FLOP/byte다. 입력 파일의 크기만 분모에 넣으면 안 된다. 출력을 쓰는 양과 다시 읽은 양도 들어가며, 캐시에 남아 재사용된 데이터는 매번 주메모리를 오가지 않는다.
원래 Roofline 논문은 이 경계를 강조하기 위해 operational intensity라는 말을 썼다. 어느 메모리 계층을 셌는지 밝히는 것이 이름보다 중요하다. HBM 트래픽으로 계산한 I에 캐시 대역폭을 곱하면 서로 다른 장부를 섞게 된다. 연산 정밀도와 곱셈·덧셈을 세는 규칙도 연산 성능 수치와 맞춰야 한다.
낮은 집약도의 예는 큰 배열을 읽어 원소마다 간단한 연산만 한 뒤 바로 저장하는 작업이다. 반면 행렬곱에서는 가져온 데이터 조각을 여러 계산에 재사용할 수 있다. 같은 수학 연산이라도 블록으로 나누는 방법과 캐시 활용에 따라 실제 전송량이 바뀐다. NVIDIA의 행렬곱·타일링 설명
지붕은 비스듬히 올라가다가 평평해진다
가장 단순한 Roofline 상한은 다음처럼 쓸 수 있다.
P ≤ min(P_peak, B_mem × I)
P는 달성한 연산 처리율, P_peak는 해당 정밀도·연산 방식의 최대 처리율, B_mem은 선택한 메모리 경계의 대역폭이다. min은 두 값 중 작은 값을 고른다. 바이트/초에 FLOP/byte를 곱하면 FLOP/초가 되어 두 항을 같은 단위로 비교할 수 있다.
가상의 장치가 20TFLOP/s의 연산 능력과 1TB/s의 메모리 대역폭을 가진다고 하자. 1바이트당 2번 계산하는 작업의 상한은 2TFLOP/s다. 연산기만 두 배 빠르게 해도 이 상한은 그대로다. 반대로 1바이트당 40번 계산한다면 대역폭이 허용하는 값은 40TFLOP/s지만, 연산 장치의 20TFLOP/s에 막힌다. 설명용 숫자이며 실제 제품의 측정치는 아니다.
가로축에 I, 세로축에 P를 놓으면 대역폭이 정하는 경사진 선과 연산기가 정하는 수평선이 만난다. 이 모양이 지붕을 닮아 Roofline이다. 다만 지붕은 도달을 보장하는 목표값이 아니다. 일감이 너무 작거나 병렬성이 부족하면 지연을 숨기지 못하고 그 아래에서 머물 수 있다. NVIDIA의 연산·메모리·지연 한계 설명
HBM은 문을 넓히고, 재사용은 왕복을 줄인다
HBM은 적층한 DRAM을 넓은 다중 채널 인터페이스로 연결하고 프로세서 가까이 배치해 큰 대역폭을 제공하는 방향의 기술이다. 셀 하나가 모든 종류의 접근을 즉시 처리한다는 의미는 아니다. 메모리 용량, 초당 전송량, 요청 하나의 지연은 서로 다른 지표다. Micron의 HBM 적층·인터페이스 설명
Roofline에서 대역폭을 늘리면 경사진 부분이 올라간다. 데이터를 더 잘 재사용해 Q를 줄이면 프로그램의 위치가 오른쪽으로 움직인다. 하드웨어와 소프트웨어가 서로 다른 방법으로 같은 병목을 완화할 수 있는 셈이다. 대신 큰 재사용 블록은 칩 내부 저장 공간을 더 요구하고, 병렬로 실행할 작업 수를 줄일 수도 있다.
따라서 ‘HBM이 빠르면 모든 연산도 같은 비율로 빨라진다’는 결론은 성립하지 않는다. 접근 패턴과 병렬성 때문에 실제 대역폭을 다 쓰지 못할 수도 있고, 이미 연산 상한에 닿았다면 다른 개선이 필요하다. 성능표의 큰 숫자를 비교하기 전에 물어야 할 것은, 이 작업이 바이트 하나를 가져와 얼마나 오래 유용하게 쓰느냐는 것이다.