파이프라이닝 및 해저드
파이프라이닝은 명령어 처리를 여러 단계로 나누어 연속적인 명령어들의 실행을 중첩시켜 처리량을 증가시키는 기법입니다. 해저드(hazards)는 자원 충돌, 데이터 의존성, 분기 등으로 인해 다음 명령어가 다음 사이클에서 진행되지 못하게 하는 상황을 의미합니다.
Definition
파이프라이닝은 여러 명령어의 처리를 순차적인 단계로 분할하여 실행을 중첩시키는 기술이며, 해저드(hazard)는 다음 클록 사이클에서 올바르게 진행할 수 없어 특정 단계가 정지(stall)하도록 강제하는 모든 조건을 의미합니다.
Scope
이 주제는 고전적인 명령어 파이프라인과 이를 제한하는 세 가지 해저드 클래스(구조적 해저드(자원 충돌), 데이터 해저드(명령어 간 의존성), 제어 해저드(분기))를 다룹니다. 또한, 포워딩/바이패싱, 스톨링, 분기 처리와 같은 표준적인 해결책을 포함합니다. 고급 병렬 발행(명령어 수준 병렬성), 심층적인 분기 방향 예측(분기 예측), 동적 재정렬(비순차적 실행)은 제외합니다.
Core questions
- 명령어 실행을 여러 단계로 나누는 것이 지연 시간을 줄이지 않으면서 처리량을 어떻게 증가시킬 수 있습니까?
- 구조적, 데이터, 제어 해저드는 무엇이며, 각각의 원인은 무엇입니까?
- 포워딩은 스톨링 없이 많은 데이터 해저드를 어떻게 해결합니까?
- 파이프라인에서 분기의 비용은 얼마이며, 어떻게 완화됩니까?
Key concepts
- 파이프라인 단계 (인출, 디코딩, 실행, 메모리, 쓰기)
- 처리량 대 지연 시간
- 구조적 해저드
- 데이터 해저드
- 제어 해저드
- 포워딩 및 바이패싱
- 파이프라인 스톨 및 버블
- 분기 페널티
Key theories
- 파이프라인 처리량 및 해저드
- k단계 파이프라인은 이상적으로는 채워진 후 사이클당 하나의 명령어를 완료하지만, 구조적, 데이터, 제어 해저드는 스톨을 발생시켜 처리량을 이상적인 수준 이하로 감소시킵니다. 파이프라인 설계는 이러한 스톨을 최소화하는 데 중점을 둡니다.
Mechanisms
명령어 처리는 여러 단계로 분할되어, 한 명령어가 실행되는 동안 다른 명령어들은 인출되고 디코딩됩니다. 구조적 해저드는 두 명령어가 동일한 자원을 필요로 할 때 발생하며, 데이터 해저드는 명령어가 아직 생성되지 않은 결과를 필요로 할 때 발생합니다. 제어 해저드는 다음 명령어가 해결되지 않은 분기에 의존할 때 발생합니다. 포워딩은 결과를 단계들 사이에서 직접 전달하며, 포워딩이 불충분할 때 스톨은 버블을 삽입하고, 분기 처리는 제어 해저드 페널티를 줄입니다.
Clinical relevance
파이프라이닝은 거의 모든 프로세서에서 기본적인 성능 향상 기술이며, 해저드를 이해하는 것은 명령어 순서와 분기 동작이 속도에 영향을 미치는 이유를 설명합니다. 컴파일러의 명령어 스케줄링과 프로그래머의 의존성 및 분기 패턴에 대한 인식은 파이프라인 하드웨어의 성능을 실질적으로 향상시킬 수 있습니다.
History
파이프라이닝은 1960년대 초 IBM Stretch 및 CDC 6600과 같은 초기 고성능 기계에서 등장했습니다. 단순한 5단계 파이프라인은 1980년대 RISC 프로세서와 함께 정형화된 교육 및 설계 모델이 되었으며, 해저드와 그 해결책에 대한 체계적인 분류는 Hennessy-Patterson 저서에서 체계화되었습니다.
Key figures
- John L. Hennessy
- David A. Patterson
- Seymour Cray
Related topics
Seminal works
- hennessy2019
- patterson2020
Frequently asked questions
- 파이프라이닝은 단일 명령어를 더 빠르게 실행하게 합니까?
- 아닙니다. 파이프라이닝은 단일 명령어 완료 시간(지연 시간)을 줄이지 않습니다. 이는 조립 라인이 개별 품목의 속도를 높이지 않고 생산량을 늘리는 것과 유사하게, 명령어 실행을 중첩시켜 단위 시간당 완료되는 명령어 수(처리량)를 증가시킵니다.
- 포워딩이란 무엇입니까?
- 포워딩 또는 바이패싱은 새로 계산된 결과를 레지스터 파일에 다시 기록될 때까지 기다리지 않고, 해당 결과를 생성한 단계에서 이를 필요로 하는 다음 단계로 직접 전달하는 것입니다. 이는 파이프라인을 스톨시키지 않고 많은 데이터 해저드를 해결합니다.