첫 결과는 늦어도 다음 입력을 매 사이클 받는 회로
첫 결과가 다섯 사이클 뒤에 나온다는 보고서와, 매 사이클 새 입력을 받을 수 있다는 보고서는 함께 참일 수 있다. 파이프라인은 한 계산의 여행 시간을 줄이지 않아도 여러 계산의 여행을 겹치게 만들 수 있기 때문이다. 이때 initiation interval, 줄여서 II는 다음 반복을 시작하는 간격을 말한다.
완료까지의 거리와 출발 사이의 거리를 나눈다
가상의 데이터 경로가 입력을 받은 경계부터 결과를 내놓기까지 항상 5사이클 걸린다고 하자. 각 입력은 독립적이고, 필요한 자원과 입출력 대역폭이 충분하다. 결과의 준비 시각을 경계 번호로 쓰며 추가 시작·종료 제어 비용은 제외한다.
| 입력 순서 | II=1의 시작→완료 | II=2의 시작→완료 |
|---|---|---|
| 0 | 0→5 | 0→5 |
| 1 | 1→6 | 2→7 |
| 2 | 2→7 | 4→9 |
| 3 | 3→8 | 6→11 |
두 구성의 첫 결과는 모두 5에 나온다. 다만 그 뒤의 결과 간격이 다르다. 8개를 처리한다면 마지막 결과 시각은 II=1에서 12, II=2에서 19다. 경로 지연을 L, 입력 수를 N이라고 쓰면 이 정해진 시간표의 완료 시각은 다음과 같다.
T = L+(N−1)×II
N=1이면 둘 다 L이다. 짧은 요청 한 개만 자주 따로 실행하는 상황에서는 II 개선이 긴 연속 처리와 같은 이익을 주지 않을 수 있다. 입력이 부족해 중간중간 비어도 마찬가지다. ‘II가 절반’이라는 숫자만으로 사용자가 기다리는 시간이 절반이라고 말할 수 없다.
앞의 8개 묶음에서는 총 완료 시간이 19에서 12로 줄어 약 1.58배 빨라진다. 두 배가 되지 않는 것은 첫 결과까지의 5사이클이 남아 있기 때문이다. 같은 모델로 100개를 넣으면 203과 104사이클이어서 비율은 약 1.95배가 된다. 반복 수가 커질수록 시작 간격의 차이가 전체 시간에 더 크게 반영된다. 이 계산에도 호출 사이의 공백이나 데이터 이동 시간은 들어 있지 않다.
AMD의 loop pipelining 설명은 이전 반복이 끝나기 전에 다음 반복을 시작하는 방식과 II를 구분해 설명한다. II를 지정하는 것은 컴파일러가 달성할 목표를 주는 일이며, 반복 의존성이 있으면 더 긴 간격이 필요할 수 있다. 앞의 표는 특정 합성 보고서를 옮긴 것이 아니라, 완료 지연과 시작 간격을 분리한 자체 예제다.
II를 나노초와 처리량으로 바꾸어 본다
같은 II도 클록 주기에 따라 실제 간격이 달라진다. 지속적으로 입력이 준비되어 있고 출력이 막히지 않는다면, 정상 구간에서의 시작 간격은 II×클록 주기다.
구성 A는 주기 4ns, II=1이고 구성 B는 주기 2.5ns, II=2라고 가정하자. A는 4ns마다 시작해 초당 2.5억 개, B는 5ns마다 시작해 초당 2억 개다. B의 클록이 더 빠르지만 시작 처리량은 A보다 작다. II와 주파수를 따로 최적화한 숫자 대신, 둘을 곱한 실제 시간 간격을 비교해야 한다.
여기서 ‘개’는 예제의 입력 반복 한 개다. 한 반복이 네 샘플을 처리하는 구조라면 샘플 처리량으로 다시 환산해야 한다. 함수 호출 간격, 루프 반복 간격, 인터페이스의 한 beat를 같은 단위로 놓으면 성능을 몇 배씩 잘못 읽을 수 있다.
메모리 요구량도 이 반복 단위에 맞춰 계산할 수 있다. 반복마다 같은 두 포트 메모리에서 읽기 세 번이 필요하고, 각 포트는 매 사이클 읽기 한 번만 처리한다고 가정하자. 지속 구간의 평균 요구량은 3/II회 읽기다. 총 용량 2회와 비교하면 II≥2라는 자원 하한이 나온다.
이 하한을 만족해도 특정 사이클에 접근이 몰리거나 다른 의존성이 있으면 II=2를 달성하지 못할 수 있다. 반대로 같은 값을 재사용해 실제 읽기를 줄이거나 메모리 구성을 바꾸면 애초에 요구량이 달라진다. AMD의 array partitioning 문서는 제한된 포트 때문에 목표 II에 도달하지 못하는 사례를 제시한다.
계산 경로의 목표와 시스템의 관측을 이어 본다
입력 수락과 출력 전달이 준비 신호에 의해 멈출 수 있는 회로라면, 합성 시간표의 II가 실제 거래 간격을 항상 보장하지는 않는다. 계산 경로가 매 사이클 새 결과를 준비해도 수신기가 두 사이클마다 하나를 소비하면, 버퍼가 찬 뒤의 지속 전달량은 수신기 속도를 넘을 수 없다.
이때 버퍼는 짧은 정지를 흡수할 수 있지만 장기 평균의 부족한 소비량을 없애지는 못한다. II=1 경로에 버퍼를 더했다는 사실과, 전체 시스템이 매 사이클 끝까지 전달한다는 사실은 다른 관측이다. 실제로 수락된 입력과 소비된 출력을 세면 내부 시간표와 외부 처리량의 차이를 확인할 수 있다.
initiation interval을 읽는 목적은 첫 결과의 빠르기를 대신할 숫자를 찾는 데 있지 않다. 한 입력의 완료 지연, 반복의 시작 간격, 입출력의 실제 전달 간격을 연결하는 데 있다. 첫 결과가 늦더라도 연속 데이터가 촘촘히 나오게 할지, 짧은 요청의 대기부터 줄일지를 그 구분 위에서 선택할 수 있다.