도구스개발

루프라인 모델(연산강도·성능 상한) 계산기

커널의 연산강도(FLOP/byte)와 기계의 최대 연산성능·메모리 대역폭으로 달성 가능한 성능 상한을 구합니다. 능선점을 기준으로 메모리에 막혔는지 연산에 막혔는지 가려 주므로 무엇을 고쳐야 할지가 분명해집니다.

연산 2n³, 행렬 3개로 3n² 요소. 그래서 I = n / (6 × 요소바이트/4)로 n에 비례합니다.
GFLOP/s
GB/s
%

사양의 이론값 대비 실제로 나오는 비율. 60~80%가 보통입니다.

연산에 막혀 있습니다

10,000 GFLOP/s

연산강도 170.6667 FLOP/byte · 능선점 12.5 · 최대 성능의 100%

루프라인

10^-310^-210^-110^010^110^210^310^4능선점 12.5↑ 성능 (GFLOP/s, 로그)연산강도 (FLOP/byte, 로그) →
빗변은 메모리 대역폭이 정하는 상한(성능 = 대역폭 × 연산강도), 천장은 연산기가 정하는 상한입니다. 둘이 만나는 능선점보다 왼쪽에 있으면 메모리에, 오른쪽에 있으면 연산에 막힌 것입니다. 점이 이 커널의 위치입니다.

무엇을 고쳐야 하나

연산 횟수2.147e+9 FLOP
옮긴 바이트12.58MB
연산강도 I170.66667 FLOP/byte
능선점 I* = 성능 ÷ 대역폭12.5 FLOP/byte
실효 대역폭800 GB/s
연산만 보았을 때214.75µs
메모리만 보았을 때15.73µs
최소 실행 시간214.75µs
연산강도가 능선점의 13.65배라 연산이 병목입니다. 대역폭을 늘려도 시간이 줄지 않습니다. 벡터화, FMA, 더 많은 코어, 알고리즘 자체의 연산 횟수 줄이기가 답입니다.
루프라인은 상한입니다. 여기 못 미치는 이유(지연을 감추지 못함, 캐시 충돌, 분기, 동기화, 정렬되지 않은 접근)는 이 그림에 나오지 않습니다. 실측이 이 선의 절반에도 못 미친다면 병목이 다른 데 있다는 뜻입니다.

연산강도는 재사용의 다른 이름이다

커널연산강도 (fp32)막히는 곳
벡터 합 c = a + b0.0833메모리
SAXPY y = αx + y0.1667메모리
내적 Σ aᵢbᵢ0.25메모리
합계 Σ aᵢ0.25메모리
2차원 5점 스텐실0.625메모리
밀집 행렬곱 n×n170.6667연산
전치 B = Aᵀ0메모리
행렬곱만 유독 연산강도가 높은 것은 데이터 하나를 여러 번 재사용하기 때문입니다. n×n 행렬곱은 연산이 2n³인데 옮기는 것은 3n²뿐이라 연산강도가 n에 비례해 커집니다. 나머지 커널은 요소 하나를 한두 번 쓰고 버리므로 크기를 아무리 키워도 연산강도가 그대로입니다.

사용 방법

  1. 1커널을 고르거나 연산 횟수와 옮긴 바이트를 직접 넣습니다.
  2. 2쓰는 기계의 최대 연산성능(GFLOP/s)과 메모리 대역폭(GB/s)을 넣습니다.
  3. 3대역폭 실측 효율을 넣으면 천장이 현실에 가까워집니다. 60~80%가 보통입니다.
  4. 4그림에서 점이 능선점의 왼쪽인지 오른쪽인지 봅니다.
  5. 5«무엇을 고쳐야 하나»에서 연산과 메모리 각각의 소요 시간을 견줍니다.

자주 묻는 질문

메모리에서 가져온 바이트 하나당 몇 번 연산하는가입니다. I = 연산 횟수 ÷ 옮긴 바이트 수이며 단위는 FLOP/byte입니다. 메모리를 초당 B 바이트 가져올 수 있으면 연산은 초당 최대 B×I번이므로, 이 값이 성능 상한을 정합니다.

메모리가 정하는 빗변과 연산기가 정하는 천장이 만나는 지점으로, I* = 최대 연산성능 ÷ 대역폭입니다. 연산강도가 이보다 작으면 메모리에, 크면 연산에 막힙니다. 기계마다 다른 값이며 최근 가속기일수록 연산성능이 대역폭보다 빨리 늘어 능선점이 오른쪽으로 밀려 왔습니다.

연산기가 데이터를 기다리느라 놀고 있다는 뜻입니다. 이때는 연산기를 두 배 빠르게 해도 시간이 전혀 줄지 않습니다. 대신 데이터를 덜 옮기는 쪽이 답입니다 — 여러 연산을 한 번의 읽기로 묶기(융합), 타일링으로 재사용 늘리기, 자료형을 좁히기. 자료형을 32비트에서 16비트로 바꾸면 연산강도가 그대로 두 배가 됩니다.

데이터 하나를 여러 번 재사용하기 때문입니다. n×n 행렬곱은 연산이 2n³인데 옮기는 것은 행렬 세 개, 곧 3n²뿐이라 연산강도가 n에 비례해 커집니다. 벡터 합이나 SAXPY는 요소 하나를 한두 번 쓰고 버리므로 크기를 아무리 키워도 연산강도가 그대로입니다. 연산강도는 결국 재사용의 다른 이름입니다.

32비트 실수라면 1/12 ≈ 0.083입니다. 요소마다 더하기가 한 번인데 읽기 둘 쓰기 하나로 12바이트를 옮기기 때문입니다. 웬만한 기계의 능선점이 5~50 사이이므로 벡터 합은 언제나 메모리에 막히며, 최대 연산성능의 1%도 쓰지 못합니다.

사양에 적힌 대역폭은 이론값이고 실제로 나오는 값은 그보다 낮기 때문입니다. 접근 패턴과 메모리 컨트롤러 사정에 따라 이론값의 60~80% 정도가 보통이며, 천장을 이론값으로 잡으면 실제보다 낙관적인 그림이 됩니다. 정확히 알고 싶으면 대역폭 측정 프로그램으로 재신 값을 넣으십시오.

루프라인은 상한이라 여기 못 미치는 이유가 여럿 있습니다. 메모리 지연을 감추지 못했거나, 캐시가 서로 밀어내고 있거나, 분기나 동기화에 시간을 쓰고 있거나, 접근이 정렬되어 있지 않을 수 있습니다. 실측이 이 선의 절반에도 못 미친다면 병목이 연산도 대역폭도 아닌 다른 데 있다는 신호입니다.

자주 바뀌기 때문입니다. 굳혀 두면 몇 달 뒤 틀린 값을 계속 내보내게 되므로, 성능과 대역폭은 쓰시는 장비의 사양이나 실측값을 직접 넣도록 두었습니다.

전송되지 않습니다. 계산은 모두 브라우저 안에서 이루어지며 입력한 값은 이 기기에만 남습니다.

알아두면 좋은 점

  • 커널의 연산강도는 «캐시에 아무것도 남지 않는다»고 보고 센 값입니다. 캐시가 잘 들으면 실제 연산강도는 이보다 높습니다.
  • 루프라인은 달성 가능한 상한입니다. 실측이 이보다 낮은 이유는 이 모델에 담기지 않습니다.
  • 연산성능과 대역폭은 직접 넣는 값입니다. 특정 제품의 수치나 가격은 담지 않았습니다.
  • 전치처럼 연산이 하나도 없는 커널은 연산강도가 0이라 언제나 메모리에 막힙니다.

함께 보면 좋은 도구

마지막 검증: 2026년 9월 2일 · 결과는 참고용 추정치입니다.