어떻게하면 CPU가 시간낭비없이 메모리에 있는 명령어들을 처리할 수 있을까?
명령어 병렬기법
1. 명령어 파이프라인
여러개의 명령어를 겹쳐서 실행하는 방법이다.
명령어가 처리되는 과정을 비슷한 시간 간격으로 나누면?
- 명령어 인출 (Instruction Fetch) : 메모리에서 명령어를 가져온다.
- 명령어 해석 (Instruction Decode)
- 명령어 실행 (Execute Instruction)
- 결과 저장 (Write Back)
같은 단계가 겹치지만 않는다면 CPU는 '각 단계를 동시에 실행할 수 있다'
명령어 파이프라인이 항상 이상적으로 실행되는 것은 아니다. 동시에 처리할 수 없는 경우도 있는데 그것이 파이프라인 위험이다.
(병렬로 명령어 처리가 되지 않는 경우)
파이프라인 위험 : 명령어 파이프라인이 성능 향상에 실패하는 경우
- 데이터 위험
- 제어 위험
- 구조적 위험
1) 데이터 위험 : 명령어 간의 의존성에 의해 야기된다. 모든 명령어를 동시에 처리할 수는 없다.
(이전 명령어를 끝까지 실행해야만 비로소 실행할 수 있는 경우)
위의 그림에서 명령어1에서 R1이 계산되기전에 명령어2를 처리할 수는 없다.
2) 제어 위험 : 프로그램 카운터의 갑작스러운 변화
3) 구조 위험 : 서로 다른 명령어가 같은 CPU 부품(ALU, 레지스터)를 쓰려고 할 때
2. 슈퍼스칼라
CPU 내부에 여러 개의 명령어 파이프라인을 포함한 구조 (오늘날의 멀티스레드 프로세서)
이론적으로는 파이프라인 개수에 비례하여 처리 속도가 증가한다. 그러나 파이프라인 위험도 증가하기 때문에 파이프라인 개수에 비례하여 처리 속도가 증가하진 않는다.
3. 비순차적 명령어 처리
비유하자면 합법적인 새치기이다.
명령어를 순차적으로 처리하면 결과적으로 순차적으로 처리할 수 없게된다.
그렇다면 3번순서의 명령어를 의존성이 없는 순서로 변경하면 어떻게 될까?
결과에는 변함이 없다. 하지만 이렇게 순서를 변경하게 되면 원활한 파이프라이닝이 가능하다.
하지만 아무 명령어의 순서를 변경할 수 있는 것은 아니다.
위의 예시를 보면 1번과 3번의 순서를 바꿀 수 없다. (3 수행을 위해 M(100)이 필요하다)
1번과 4번의 순서를 바꿀 수도 없다. (1을 토대로 3이 수행되고, 3을 토대로 4가 수행된다)
4번과 5번의 순서는 변경 가능하다.
이렇게 변경하여도 전체 프로그램 실행 흐름에는 영향이 없다.
'컴퓨터구조와 운영체제' 카테고리의 다른 글
RAM의 특성과 종류 (1) | 2024.07.03 |
---|---|
명령어 집합 구조 (0) | 2024.07.02 |
빠른 CPU를 위한 설계 기법 (0) | 2024.06.28 |
명령어 사이클과 인터럽트 (0) | 2024.06.27 |
레지스터 (0) | 2024.06.26 |