---
title: "첫 결과는 늦어도 다음 입력을 매 사이클 받는 회로"
author: "브레이브브라우저쓰자"
published_at: "2026-10-25T10:52:02.286Z"
updated_at: "2026-10-06T02:25:03.467Z"
tags: ["initiation interval"]
canonical_url: "https://ariser.io/@writer_a9817d5a8de0/%EC%B2%AB-%EA%B2%B0%EA%B3%BC%EB%8A%94-%EB%8A%A6%EC%96%B4%EB%8F%84-%EB%8B%A4%EC%9D%8C-%EC%9E%85%EB%A0%A5%EC%9D%84-%EB%A7%A4-%EC%82%AC%EC%9D%B4%ED%81%B4-%EB%B0%9B%EB%8A%94-%ED%9A%8C%EB%A1%9C"
ai_assisted: true
---

# 첫 결과는 늦어도 다음 입력을 매 사이클 받는 회로

이 글은 AI가 활용됐습니다.

[원문](https://ariser.io/@writer_a9817d5a8de0/%EC%B2%AB-%EA%B2%B0%EA%B3%BC%EB%8A%94-%EB%8A%A6%EC%96%B4%EB%8F%84-%EB%8B%A4%EC%9D%8C-%EC%9E%85%EB%A0%A5%EC%9D%84-%EB%A7%A4-%EC%82%AC%EC%9D%B4%ED%81%B4-%EB%B0%9B%EB%8A%94-%ED%9A%8C%EB%A1%9C)

첫 결과가 다섯 사이클 뒤에 나온다는 보고서와, 매 사이클 새 입력을 받을 수 있다는 보고서는 함께 참일 수 있다. 파이프라인은 한 계산의 여행 시간을 줄이지 않아도 여러 계산의 여행을 겹치게 만들 수 있기 때문이다. 이때 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 설명](https://docs.amd.com/r/en-US/ug1399-vitis-hls/Pipelining-Loops)은 이전 반복이 끝나기 전에 다음 반복을 시작하는 방식과 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 문서](https://docs.amd.com/r/en-US/ug1399-vitis-hls/Array-Partitioning)는 제한된 포트 때문에 목표 II에 도달하지 못하는 사례를 제시한다.

## 계산 경로의 목표와 시스템의 관측을 이어 본다

입력 수락과 출력 전달이 준비 신호에 의해 멈출 수 있는 회로라면, 합성 시간표의 II가 실제 거래 간격을 항상 보장하지는 않는다. 계산 경로가 매 사이클 새 결과를 준비해도 수신기가 두 사이클마다 하나를 소비하면, 버퍼가 찬 뒤의 지속 전달량은 수신기 속도를 넘을 수 없다.

이때 버퍼는 짧은 정지를 흡수할 수 있지만 장기 평균의 부족한 소비량을 없애지는 못한다. II=1 경로에 버퍼를 더했다는 사실과, 전체 시스템이 매 사이클 끝까지 전달한다는 사실은 다른 관측이다. 실제로 수락된 입력과 소비된 출력을 세면 내부 시간표와 외부 처리량의 차이를 확인할 수 있다.

initiation interval을 읽는 목적은 첫 결과의 빠르기를 대신할 숫자를 찾는 데 있지 않다. 한 입력의 완료 지연, 반복의 시작 간격, 입출력의 실제 전달 간격을 연결하는 데 있다. 첫 결과가 늦더라도 연속 데이터가 촘촘히 나오게 할지, 짧은 요청의 대기부터 줄일지를 그 구분 위에서 선택할 수 있다.

