CPU의 명령어 처리에 한 방법이며, 하나의 작업을 여러 단계로 나누어 각 단계를 병렬로 처리해 작업 속도를 높이는 최적화 기법
입니다. 간단하게 CPU가 시간을 알뜰하게 사용해 명령어를 처리하는 방법을 말한다.
CPU란?
컴퓨터 시스템을 통제하고 프로그램의 연산을 실행 · 처리하는 가장 핵심적인 컴퓨터의 장치
명령어 인출
-> 명령어 해석
-> 명령어 실행
-> 명령어 저장
으로 구성 되있으며
명령어 인출
: 메모리에서 명령어를 가져오는 단계이다.
명령어 해석
: 명령어를 해석하고 레지스터나 필요한 데이터를 확인하는 단계
명령어 실행
: 산술 논리 장치(ALU)에서 연산을 수행하는 단계
명령어 저장
: 계산 결과를 레지스터에 저장하는 단계
ALU?
CPU의 구성 요소로 연산을 해주는 계산기라고 생각하면 된다
명령어 인출
-> 명령어 해석
-> 오퍼랜드 인출
-> 명령어 실행
-> 명령어 저장
으로 구성
명령어 인출
: 메모리에서 명령어를 가져오는 단계이다.
명령어 해석
: 명령어를 해석하고 레지스터나 필요한 데이터를 확인하는 단계
오퍼랜드 인출
: 레지스터나 메모리에서 필요한 데이터를 가져오는 단계
명령어 실행
: 산술 논리 장치(ALU)에서 연산을 수행하는 단계
명령어 저장
: 계산 결과를 레지스터에 저장하는 단계
오퍼랜드?
연산을 수행 하는데 필요한 데이터 혹은 데이터 주소
예시 - 빨래를 세탁기 넣는다
-> 세탁기를 작동시킨다
-> 건조기를 작동시킨다
-> 빨래를 갠다
세탁이라는 작업을 여러가지 단계로 나누어 실행을 했을 때, 작업속도를 높일 수 있으며, 여러개의 세탁기와 건조기를 두고 사용을 하면 그 속도는 배가 된다는 말이다.
CPU의 처리 속도와 효율 극대화기 위함
단일 사이클을 사용하면 한 명령어가 끝날 때까지 다른 명령어를 실행하지 못하게 되며, CPU의 많은 자원이 유휴상태가 됩니다.
유후상태
작업을 안하고 쉬는 상태
제어 해저드
, 구조적 해저드
, 데이터 해저드
로 구성
제어 해저드
분기가 결정된 시점에 수행되지 않을 명령어가 파이프라인에 존재할 때 발생
파이프라인 구조에서 프로그램 흐름을 변경하는 명령어가 처리될 때 발생하며, 파이프라인 처리에서의 효율성을 높이기 위해서 개발
프로그램의 흐름이 어디로 갈지 미리 예측하고 그에 맞게 명령을 실행하여 성능을 최적화하는 기술
Static Branch Prediction(정적 예측)
Dynamic Branch Prediction(동적 예측)
stalling
선행 명령어에서 데이터 준비가 완료될 때까지 후속 명령어는 대기시킨다. (분기예측이 실패하거나 예측할 수없는경우 사용)
구조적 해저드
자원 충돌이 발생하여 H/W가 여러 명령들의 수행을 지원하지 않을 때 발생
파이프라인 처리에서의 자원 충돌을 피하고, 효율적으로 자원을 사용할 수 있도록 하여 파이프라인의 성능을 최적화하려는 목적으로 개발
stalling
선행 명령어에서 데이터 준비가 완료될 때까지 후속 명령어는 대기시킨다.(명령어 자원이 추가 되기 전에 사용)
-자원추가
가산기 추가
별도 가산기 추가
전용 연산기 추가
곱셈기, 나눗셈기 등 ALU 내 다수 작업위한 별도 연산장치 추가
-저장장소 활용
Register 사용
시분할 Read/Write 접근 / 멀티 포트 레지스터 사용
데이터 해저드
후속 명령어가 아직 완료되지 않은 레지스터 값을 필요로 할 때 발생하는 문제
Read After Write(RAW)
이전 명령어가 결과를 쓰기 전에, 다음 명령어가 읽기 작업을 먼저 수행할 경우 발생
Write After Read(WAR)
이전 명령어가 특정 값을 읽기 전에 다음 명령어가 그 값을 쓰려고 할 때 발생
Write After Write(WAW)
두 개의 명령어가 동일한 레지스터에 결과를 쓰려고 할 때 발생
파이프라인의 성능 저하를 일으킬 수 있기 때문에 해결하기위해 개발.
Data forwarding(전방전달)
쓰기 명령어 전, 쓰기 내용이 계산되면 다음 명령어로 미리 받아온다
Out-of-Order Execution(비순차적 명령어 처리)
명령어를 순서대로 실행하는 대신, 의존성이 없는 명령어들을 먼저 실행하는 방식
3번 명령어를 마지막으로 보내 효율성을 높일 수 있습니다.
Stalling(파이프라인 정지)
데이터가 준비될 때까지 파이프라인을 멈추는 방식으로 다음 단계로 명령어를 넘기지 않고 대기 상태를 유지하는 방식
오류가 생긴 단계에서 정지를 시키고 다음번의 명령어로 넘겨버림
참고자료
chat GPT.
구글 서칭
벨로그