[컴퓨터 구조 2] 명령어 병렬처리 기법(ILP)과 CISC/RISC
빠른 CPU를 만들려면 클럭 속도도 높이고 멀티코어, 멀티스레드를 지원하게 하는 것이 중요하다. 하지만, CPU가 많아봤자 이걸 놀리면 무슨 쓸모가 있을까? 따라서 모든 CPU가 노는 시간 없이 명령어를 동시에 처리해야 속도가 빨라진다.
이걸 지원하는 게 명령어 병렬처리 기법(ILP; Instruction-Level Parallelism)이다.
ILP(Instruction-Level Parallelism)
명령어 파이프라이닝(Instruction Pipelining)
다음과 같이 공장 생산라인처럼 명령어 처리 과정이 클럭 단위로 나뉜 것을 명령어 파이프라인(pipeline)이라고 한다.
도식과 같이 명령어 인출(fetch)-명령어 해석(decode)-명령어 실행(execute)-메모리 접근(memory)-결과 저장(write)의 단계로 이뤄져있다면, 인출 단계가 끝난 명령어 A를 다음 해석 단계로 넘길 때
새로운 명령어 B를 인출 단계로 집어 넣어, 쉬는 타임이 없도록 한다. 이게 명령어 파이프라이닝.
그런데 이 경우 특정 상황에선 파이프라이닝이 실패하는 경우가 있는데, 이를 ‘파이프라인 위험(pipeline hazard)’이라 한다. 크게 3가지가 있는데 표와 같다.
위험 종류 | 설명 |
---|---|
데이터 위험 (data hazard) |
명령어 간 '데이터 의존성'에 의해 발생 의존적인 명령어를 동시에 실행하면 메모리 값 설정이 꼬임 |
제어 위험 (control hazard) |
(주로 분기로 인해) 프로그램 카운터(PC) 값이 갑작스레 변할 때 발생 분기를 예측하지 못하면 쓸모없는 명령어들을 가져와서 처리하는 꼴이 됨 |
구조적 위험 (structural hazard) |
서로 다른 명령어가 동시에 같은 CPU 부품을 사용할 때 자원이 부족해 발생 = 자원 위험(resource hazard) |
슈퍼 스칼라(Superscalar)
앞서 말한 파이프라인을 여러개로 늘린 구조. 그림과 같이 시간(가로축: t)이 흐를 때 IF(fetch)도 두 곳에서, ID(decode)도 두 곳에서 하다보니 더 효용이 높다. 이 경우 전보다 약 2배 더 빨라지게 된다.
매 클럭 주기마다 동시에 여러 명령어를 인출할 수도, 실행할 수도 있지만 하나의 파이프라인을 사용할 때보다 파이프라인 위험을 맞이할 가능성이 더 높아진다는 게 단점.
비순차적 명령어 처리(OoOE)
이외에도 명령어를 합법적으로 새치기 시키는 기술도 있다.
책의 내용과는 핀트가 좀 달라보이긴 하나 어쨌든 OoOE니까 맞겠지 뭐..
다음과 같이 순차적으로 명령어를 처리(OE, 상단)하면 2번과 3번 명령어를 수행하는 과정에서 교착(stall)이 발생한다. 그런데 명령어 1, 2, 3번이 참조하는 메모리는 서로 겹치지 않기 때문에 앞서 말한 구조적(자원) 위험과는 상관이 없는 상태이다.
즉 MOV [R1], R2 과정에서 메모리 참조(M)가 길어지는 상황에서 다음 명령어의 처리를 마냥 기다릴 필요는 없다는 뜻. 따라서 명령어 2, 3번은 교착에 빠지지 않고 알아서 파이프라인 상에서 실행(E)과 해독(D) 과정으로 진입한다.
이것이 비순차적 명령어 처리(Out of Order Execution)이다. 책에선 서로 독립적인 메모리를 사용할 때 아예 명령어 자체의 순서를 바꿨는데, 예시 도식에선 명령어 처리 과정의 일부 순서만 바꾸는 게 나온 듯. 뭐가 맞으려나?
ISA(Instruction Set Architecture)
우리가 쓰는 CPU는 종류도, 회사도 다양하다. 따라서 사용하는 구조나 연산 및 방식도 조금씩 다르기에, CPU가 이해할 수 있는 명령어들도 조금씩 다르다.
이때 CPU가 이해할 수 있는 명령어들의 모음을 ‘명령어 집합 구조(ISA; Instruction Set Architecture)’라 부른다.
크게 현대의 ISA는 두 부류로 나뉜다. CISC와 RISC인데 테이블 상에서 비교해보자.
CISC VS. RISC
CISC | RISC | |
---|---|---|
명칭 | Complex Instruction Set Computer | Reduced Instruction Set Computer |
명령어의 특징 | 복잡하고 다양한 명령어. 가변 길이 수행시간이 길고 규격 없음 |
단순하고 적은 명령어. 고정 길이 수행시간이 짧고 규격화됨 |
주소 지정 방식 | 다양한 방식 지원 | 몇몇 방식만 지원 |
프로그램의 길이 | 명령어 수가 적어 짧음 | 명령어 수가 많아 긺 |
파이프라이닝 | 클럭이 제각각이라 파이프라이닝 어려움 | 1클럭 내외로 수행돼 파이프라이닝 쉬움 |