독서/컴퓨터구조
Pipeline
Thinking
2024. 11. 5. 01:31
파이프라인(Pipelining) 설계 기법
파이프라인 설계는 CPU의 성능을 향상시키기 위해 각 명령어의 실행을 여러 단계로 분할하여 동시에 여러 명령어를 처리하는 방법입니다. 이를 통해 CPU는 각 사이클에 한 명령어가 아닌 여러 명령어의 일부를 실행할 수 있습니다.
1. Non-Pipeline Design
파이프라인을 적용하지 않은 설계 방식에는 싱글 사이클 구현과 멀티 사이클 구현이 있습니다.
싱글 사이클 구현 (Single Cycle Implementation)
- 설명: 모든 명령어가 한 사이클에서 실행됩니다. 각 명령어가 완료될 때까지 하나의 클럭 사이클을 사용하기 때문에, 복잡한 명령어도 동일한 사이클 내에서 처리해야 합니다.
- 특징:
- 구현이 단순하여 이해하기 쉽지만, 복잡한 명령어가 있는 경우 속도가 느려집니다.
- 자원을 효율적으로 사용하지 못하므로 CPU 자원의 활용도가 낮습니다.
- 모든 명령어가 가장 긴 명령어의 실행 시간에 맞추어야 하므로 비효율적입니다.
멀티 사이클 구현 (Multi Cycle Implementation)
- 설명: 각 명령어를 여러 사이클에 걸쳐 나누어 실행합니다. 각 명령어는 여러 사이클 동안 실행되며, 명령어마다 필요한 사이클 수가 다를 수 있습니다.
- 특징:
- 복잡한 명령어도 여러 단계로 나눠 처리하므로 자원을 효율적으로 사용할 수 있습니다.
- 주로 각 사이클에 다른 하드웨어를 사용할 수 있어 하드웨어 재사용이 가능해집니다.
- 단점으로는 파이프라인에 비해 성능이 낮으며, 각 사이클에서 명령어 단계를 전환하기 위한 제어가 필요합니다.
2. Pipeline Design
파이프라인 설계는 명령어의 실행을 여러 단계로 나누어 각 단계에서 서로 다른 명령어가 동시에 실행되도록 하는 방식입니다. 이를 통해 성능을 크게 개선할 수 있습니다.
- 단계 분할: 명령어의 실행을 여러 단계로 나눕니다. 일반적으로 IF (Instruction Fetch), ID (Instruction Decode), EX (Execute), MEM (Memory Access), WB (Write Back) 단계로 나뉩니다.
- 단계 겹침: 각 단계가 겹쳐지며 실행됩니다. 예를 들어, 첫 번째 명령어가 ID 단계에 있을 때, 두 번째 명령어는 IF 단계에서 가져올 수 있습니다.
- 장점:
- 각 클럭 사이클마다 한 단계씩 다른 명령어를 처리할 수 있어 CPU 효율성이 증가합니다.
- 파이프라인 길이가 길어질수록 더 많은 명령어를 동시에 실행할 수 있습니다.
- 단점:
- 데이터 의존성(Data Dependence), 제어 의존성(Control Dependence) 문제가 발생할 수 있습니다.
- 파이프라인 중단(스톨)이나 버블(Bubble) 발생 가능성도 있어 이를 해결하기 위한 추가 회로가 필요합니다.
데이터 의존성 (Data Dependence)
파이프라인 설계에서 가장 큰 문제 중 하나는 명령어 간의 데이터 의존성입니다. 데이터 의존성은 이전 명령어의 결과를 이후 명령어가 사용하는 경우 발생합니다.
1. 읽기-후-쓰기 의존성 (Read-After-Write, RAW)
- 설명: 이전 명령어가 레지스터에 값을 쓰기 전, 후속 명령어가 해당 레지스터 값을 읽으려 할 때 발생하는 의존성입니다.
- 예시:
ADD R1, R2, R3 ; R1에 R2 + R3의 결과를 저장
SUB R4, R1, R5 ; R1의 값이 필요하지만 ADD 명령어가 아직 완료되지 않았음
해결 방법: 데이터 포워딩(forwarding) 또는 파이프라인 스톨을 통해 해결할 수 있습니다.
2. 쓰기-후-쓰기 의존성 (Write-After-Write, WAW)
- 설명: 두 명령어가 같은 레지스터에 값을 쓰려 할 때, 후속 명령어가 먼저 실행되어 덮어쓰는 상황에서 발생합니다. 파이프라인에서는 일반적으로 발생하지 않지만, 멀티스레드 환경이나 초스칼라 프로세서에서 나타날 수 있습니다.
- 예시:
ADD R1, R2, R3 ; R1에 값 쓰기 MUL R1, R4, R5 ; ADD보다 먼저 실행되면 데이터 덮어쓰기 발생
- 해결 방법: 후속 명령어의 실행을 지연시키는 방식으로 해결할 수 있습니다.
3. 쓰기-후-읽기 의존성 (Write-After-Read, WAR)
- 설명: 후속 명령어가 이전 명령어의 값을 읽기 전에, 이전 명령어가 먼저 해당 값에 쓰기 작업을 해야 할 때 발생합니다. 이는 파이프라인 구조에서는 자주 발생하지 않으나 멀티스레드 또는 초스칼라 환경에서 문제로 이어질 수 있습니다.
- 예시:
SUB R4, R1, R5 ; R1의 값을 읽기 ADD R1, R2, R3 ; R1에 값 쓰기
- 해결 방법: 후속 명령어가 값을 읽기 전에 이전 명령어가 완료되도록 순서를 조정합니다.
4. 참고사항
- 제어 의존성: 분기문 또는 조건문과 같은 제어 흐름이 파이프라인에서 의존성을 발생시킬 수 있습니다. 분기 예측(branch prediction)과 같은 기술을 사용해 해결합니다.
- 파이프라인 해저드: 위의 의존성으로 인해 파이프라인이 멈추거나 버블이 발생하는 상황을 해저드(hazard)라고 합니다. 데이터 해저드, 제어 해저드 등이 있으며, 각 해저드마다 해결 방법이 필요합니다.
파이프라인은 CPU 성능을 크게 향상시키는 중요한 설계 방식입니다. 그러나 데이터 의존성 문제, 제어 의존성 문제 등 다양한 해저드가 발생할 수 있으며 이를 해결하기 위한 기법들이 필요합니다. 데이터 포워딩, 파이프라인 스톨, 분기 예측 등의 기법을 통해 파이프라인의 효율성을 극대화할 수 있습니다.
https://kuocw.korea.ac.kr/contentView/contentView.action?content_no=6433&subjectNo=1384
(컴퓨터구조) 컴퓨터구조 (190410)
공학>컴퓨터 · 통신>컴퓨터과학 조회1264 주차6 차시2 년도/학기 2019 / 1 강 사 최린 저 작 권 등 록 자 운영자 등록일자 2019-04-12 첨부파일 원본출처 원본
kuocw.korea.ac.kr