공부하는 스누피
[컴퓨터구조] 파이프라이닝 본문
파이프라이닝(pipelining)은 여러 명령어가 중첩되어 실행되는 구현 기술이다.
세탁소로 파이프라이닝의 예를 들 수 있는데, 세탁소에서 하는 일의 순서는 다음과 같다.
1. 세탁기에 옷을 넣는다.
2. 세탁기를 다 돌리면 건조기에 옷을 넣는다.
3. 건조기를 다 돌리면 건조된 옷을 갠다.
4. 선반에 옷을 놓아달라고 동료에게 부탁한다.
여기서 파이프라이닝이 되지 않았을 경우, 여러 번의 작업을 수행하면 다음과 같은 순서로 진행된다.
- 파이프라이닝 되지 않은 방법
작업 큐: A, B, C
1) A1 (A의 옷에 대해 1번 작업을 수행하는 것을 의미)
2) A2
3) A3
4) A4
5) B1
...
8) B4
9) C1
...
12) C4
이 방법에서는 위와 같이 한 작업이 모든 일을 끝낼 때까지 다음 작업이 기다리게 된다. 반면, 파이프라인 방법은 모든 단계의 일을 동시에 작업하도록 해 시간이 덜 걸린다. 쉽게 이야기하자면 1, 2, 3, 4번 일을 맡은 사람이 4명 있을 때, 파이프라이닝되지 않은 방법으로는 이전 순서의 사람이 일을 마쳐서 넘겨주기 전까지 나머지 사람은 쉬게 된다. 파이프라인 방법으로는 항상 모든 사람이 바쁘게 일을 하게 된다. 위의 예제를 파이프라이닝된 방법으로 바꾸어 보자.
- 파이프라인 방법
작업 큐: A, B, C
1) A1
2) B1 A2
3) C1 B2 A3
4) C2 B3 A4
5) C3 B4
6) C4
파이프라이닝은 작업 자체의 시간은 개선하지 못하지만, 작업이 여러 개가 있을 때 걸리는 시간을 개선시킨다 (처리량 증가). 이 원리는 명령어 실행을 파이프라인화한 프로세서에도 적용된다.
- LEGv8 명령어 작업 순서
1) IF : 메모리에서 명령어를 가져온다 (PC, 메모리 유닛, Adder)
2) ID : 명령어를 해독하는 동시에 레지스터를 읽는다. (레지스터 파일, 부호확장 유닛)
3) EX : 연산을 수행하거나 주소를 계산한다. (ALU, 쉬프트 유닛, 결과 Adder, 멀티플렉서)
4) MEM : (필요하면) 데이터 메모리에 있는 피연산자에 접근한다. (데이터 메모리 유닛)
5) WB : (필요하면) 결과값을 레지스터에 쓴다. (멀티플렉서)
명령어 처리 관점에서 파이프라이닝은 개별 명령어의 실행시간을 줄이지는 못하지만 대신 명령어 처리량을 증대시킴으로써 성능을 향상시킨다. LEGv8 명령어 집합은 파이프라인의 실행을 위해 각 명령어가 같은 길이를 갖게 한다.
단일 사이클 데이터패스에서는 위 5단계 작업 순서가 5단계 파이프라인을 의미한다. 데이터패스를 그릴 때, 대체로 작업 순서에 따라 오른쪽으로 움직여 가지만, WB 단계와 PC의 다음 값을 선정하는 단계에서는 오른쪽에서 왼쪽으로 움직인다. WB 단계는 결과를 데이터패스의 중앙에 있는 레지스터 파일에 써야 하기 때문이고, PC의 다음 값을 정하려면 MEM 단계의 분기 주소와 증가된 PC 값 중에 하나를 골라야 하기 때문이다.
파이프라인 해저드
명령어가 다음 클럭 사이클에서 실행될 수 없는 상황을 해저드(hazard)라고 부른다.
구조적 해저드(sturctural hazard)
- 같은 클럭 사이클에 실행하기를 원하는 명령어 조합을 하드웨어에서 지원할 수 없는 경우 발생
데이터 해저드(data hazard)
- 어떤 단계가 다른 단계가 끝나기를 기다려야 하기 때문에 파이프라인이 지연되어야 하는 경우 발생.
- 어떤 명령어가 아직 파이프라인에 있는 앞 명령어에 종속성을 가질때 일어남.
=> ADD 연산의 결과값을 참조하는 SUB 연산 명령어가 붙으면 ADD연산이 끝날때까지 SUB 연산이 지연된다.
- 별도의 하드웨어를 추가하여 값을 내부 자원으로부터 일찍 받아와 해결할 수 있다. 이를 전방전달(forwarding) 또는 우회전달(bypassing)이라고 한다.
=> ALU가 ADD 명령의 합을 만들어 내자마자 SUB의 입력으로 사용할 수 있다.
=> 전방전달은 앞의 명령어가 뒤의 명령어에게 결과값을 전달하는 것을 의미한다.
=> 우회전달은 결과값이 레지스터 파일을 거치지 않고 우회하여 원하는 유닛으로 전달되는 것을 의미한다.
- 전방전달은 적재-사용 데이터 해저드(load-use data hazard)에서의 지연을 방지할 수 없다.
적재-사용 데이터 해저드에서는 적재 명령어에 의해 적재된 데이터를 다른 명령어가 필요로 하는데, 필요한 시점가지 데이터가 도착하지 않아서 생기는 해저드로, 전방 전달을 해도 한 단계가 지연되어야 한다. 이 해저드를 피하기 위해 명령어의 순서를 바꾸는 소프트웨어를 사용한다. 파이프라이닝 과정에서 발생하는 지연을 bubble이라 부른다.
제어 해저드(control hazard)
- 다른 명령어들이 실행 중에 하나의 명령어의 결과값에 기반을 둔 결정을 할 필요가 있을 때 발생
- 명령어 주소의 흐름이 파이프라인이 기대한 것과 다르기 때문에 발생한다.
- 해결책
1) 지연(stall)
: 적절한 결과값이 나올때까지 해당 작업을 반복해서 수행한다. 다른 작업의 지연을 초래한다.
(ex. 조건부 분기 명령어 - 조건문을 꺼낼 때까지 조건에 필요한 결과값들이 무엇이 있는지 모름)
2) 예측(predict)
: 예측이 옳으면 지연이 없고, 틀리면 지연이 발생한다. 동적 예측 방법 중 하나는 각 분기마다의 이력을 기록하고, 최근 이력을 사용해서 미래를 예측한다.
3) 지연결정(delayed decision)
: 지연분기(delayed branch)는 다음 순서의 명령어를 항상 실행하는데, 실제 분기는 명령어를 파이프라인에 넣고 나서 한 사이클 있다가 일어난다. 대기하는 사이클동안 다음 순서의 명령어를 실행하고, 분기 명령어 뒤에 배치한다.
(참고)
David A. Patterson, John L. Hennessy (2018). Computer Organization and Design (ARM Edition)
'CS > 컴퓨터구조' 카테고리의 다른 글
[컴퓨터구조] 캐시 (cache) (2) | 2020.11.15 |
---|---|
[컴퓨터구조] 논리회로 (0) | 2020.11.12 |
[컴퓨터구조] 부동소수점 (0) | 2020.11.10 |
[컴퓨터구조] 프로그램 번역과 실행 과정 (0) | 2020.11.08 |
[컴퓨터구조] 2의 보수 표현법 (two's complement) (0) | 2020.11.07 |