이 단원 목차
1. 연산과 데이터 이동을 셀 경계 정하기
계산 커널은 연산을 수행하면서 데이터를 옮깁니다. 가속기와 외부 메모리 사이처럼 경계를 하나 정합니다. 부동소수점 연산 수를 , 그 경계를 통과한 바이트 수를 라고 하면 연산 집약도는 이며 단위는 FLOP/byte입니다. 타일링과 캐시 재사용으로 연산 수를 그대로 두고 전송량을 줄일 수 있습니다. 어느 경계에서 세었는지, 융합 곱셈-덧셈을 두 FLOP으로 세는지 기록합니다. Williams, Waterman, Patterson의 Roofline 기술 보고서
2. 처리율을 제한하는 두 조건 유도하기
최대 연산 처리율을 FLOP/s, 메모리 대역폭을 byte/s라고 하면 연산에는 적어도 , 데이터 전송에는 적어도 의 시간이 걸립니다. 두 과정이 완전히 겹치는 이상적인 실행 시간은 둘의 최댓값입니다. 해당 처리율의 상한은 다음과 같습니다.
두 상한이 만나는 연산 집약도는 입니다. 로그 그래프에서는 대역폭 상한의 기울기가 1이고 연산 상한은 수평입니다. 지속 처리율을 실측해서 쓰면 비슷한 조건에서 달성 가능한 범위를 가늠할 수 있습니다. 장치가 제공하는 절대 최대치를 쓰면 경계와 작업량 가정 아래에서 낙관적인 한계를 얻습니다.
3. 메모리 재사용의 효과 손으로 계산하기
십진 단위를 써서 가상의 가속기에 TFLOP/s, GB/s를 둡니다. 교차점은 40 FLOP/byte입니다. FLOP과 MB인 커널은 집약도가 10 FLOP/byte, 처리율 상한이 2 TFLOP/s입니다. 연산에 0.125 ms, 전송에 0.5 ms가 필요하므로 실행 시간의 하한은 0.5 ms입니다.
전송량을 20 MB로 줄이면 집약도는 50 FLOP/byte가 됩니다. 전송 시간은 0.1 ms로 줄고 실행 시간 하한은 0.125 ms가 됩니다. 두 버전이 수행하는 연산 수는 같습니다. 같은 경계를 통과한 바이트를 더 많이 재사용하면서 예상 병목이 바뀝니다.
4. 지연과 대역폭 구분하기
대역폭은 여러 전송이 진행될 때 초당 이동하는 바이트 수입니다. 지연은 특정 요청이 완료될 때까지 걸리는 시간입니다. 읽기 요청이 앞선 결과에 의존하면 대역폭이 높아도 개별 지연이 누적될 수 있습니다. 커널 실행 준비, 동기화, 캐시 미스, 불완전한 겹침도 실제 시간을 늘립니다. 모든 커널 작업보다 앞서 순차적으로 발생하는 실행 준비 시간이 0.02 ms라면 하한에 더합니다. 다른 단계와 겹치면 그 실행 순서를 확인하고 시간을 합칩니다.
5. Python으로 두 상한을 계산하기
from math import isclose
peak, bandwidth, operations = 8e12, 200e9, 1e9
for moved in [100e6, 25e6, 20e6]:
intensity = operations / moved
compute_time = operations / peak
transfer_time = moved / bandwidth
lower_bound = max(compute_time, transfer_time)
roof = min(peak, bandwidth * intensity)
assert isclose(operations / lower_bound, roof)
print(f"{intensity:5.1f} FLOP/B, {roof/1e12:4.1f} TFLOP/s, {lower_bound*1e3:.3f} ms")
assert isclose(peak / bandwidth, 40)
6. 재현 가능한 성능 비교 실험 설계하기
같은 계산을 하는 각 구현에서 실행 시간과 외부 메모리 전송량을 잽니다. 입력 크기와 모양, 수치 정밀도, 배치 크기, 준비 실행 여부, 컴파일이나 전송의 포함 여부를 기록합니다. 하드웨어 카운터, 지속 대역폭을 재는 작은 벤치마크, 커널 실행 준비 시간의 별도 측정으로 상한과 실측값의 차이를 분석합니다. 개별 요청 지연과 전송량을 구분하려면 각각을 달리 바꾸는 실험을 설계합니다.
설명할 수 있나요?
실험 설정과 무관한 기준 예제를 묻습니다. 답을 고르고 설명을 확인해보세요.
선택한 답과 학습 표시는 이 브라우저에 저장됩니다. 다시 풀거나 표시를 해제할 수 있습니다.