1. 파이프라인 사용 이유


t1, t2... t3를 순차적으로 실행하면 너무 느리기 때문에 병렬적으로 연산하려고 사용.


2. 어떻게 사용하는데?


우리가 빨래를 할 때 세탁, 건조, 다림질, 옷장에 넣기 등등 각 테스크를 한 방에 하는 게 아니라

옷 하나씩 각 테스크를 순차적으로 돌리는 거지. 그러면 세탁 끝나고 건조할 때 세탁은 놀고있으니 바로 다음 옷을 투입하는 거야.

이 일련의 각 단계에서 가장 오래 걸리는 단계를 '클럭 사이클'이라고 해.

왜냐하면 제일 빠른 단계의 테스크가 끝나도 다음 단계로 넘어가려면 전체 작업이 끝나야 하거든.

예를 들어 건조가 끝났어도 세탁이 안 끝나면 다음 옷을 투입시키지 못하지.


3. 그래서 직렬 연산보다 얼마나 빨라지는데?


n 개의 task들에 대해서

클럭 사이클이 tp 만큼 걸렸을 때 세그먼트가 k번 진행된다 하면

t1이 완료되는 시간은 위 그림에서 보다시피 k*tp 시간이 걸리고

나머지 (n - 1)의 테스크는 (n - 1) * tp의 시간이 걸리지.

t1이 먼저 끝나고 나머지 테스크가 순차적으로 끝나니깐 당연한 거겠지?

고로 총 클럭 사이클 시간은 k * tp + (n - 1) * tp = (k + n - 1)tp 만큼 걸리고

클럭 사이클은 총 k + n - 1개가 된다는 걸 알 수 있어.


그럼 직렬연산(비 파이프라인)일 때를 생각해보자.

각 테스크를 완료하는데 걸리는 시간이 tn일 때 전체 수행시간은 n * tn이 걸리겠지?

그럼 증가율을 s 라 정의했을 때

s는 '직렬 연산 시간 / 병렬 연산 시간 ' 으로 정의가 되고

s = n * tn / (k + n - 1) * tp 가 되는데

n이 무한히 증가한다고 가정해보자 limit(n -> 무한)

그러면 s = tn / tp 로 간소화가 되지.

이 때 한 테스크의 수행시간이 같다고 가정을 한다면 tn = k * tp가 돼. (위 그림을 보면 알 수 있어)

그러면 s = k * tp / tp = k

즉, 파이프 라인의 최대 속도 증가율은 세그먼트의 수 k 라고 할 수 있는 거야.