혼자 공부하는 컴구, 운체

[2주차] Chapter 05. 클럭, 멀티코어, 멀티스레드, 명령어 병렬 처리 기법, CISC, RISC

털난 모짜렐라 2023. 7. 16. 22:09

Chapter 05 CPU 성능 향상 기법


05-1 빠른 CPU를 위한 설계 기법

1. 클럭

클럭 속도

 -1초에 클럭이 몇 번 반복되는지를 나타내는 헤르츠(㎐) 단위로 측정하며, CPU 속도 단위로 간주되기도 한다. 1㎓=10⁹

  컴퓨터 부품들은 '클럭 신호'에 맞춰 일사불란하게 움직이고, CPU는 '명령어 사이클'이라는 정해진 흐름에 맞춰 명령어들을 실행한다.

= 클럭 신호가 빠르게 반복된다면, 명령어 사이클도 빨라진다.

 -클럭 속도는 일정하지 않다. 기본 클럭 속도(Base)와 최대 클럭 속도(Max)가 있고 필요한 성능에 따라 유연하게 조절한다.

 -오버클럭킹(overclocking) : 최대 클럭 속도를 강제로 더 끌어올리는 기법 

 -클럭 속도 만으로 CPU의 성능을 올리는 것에는 한계가 있다. 클럭 속도를 무작정 높이면 발열 문제가 심각해진다. 

 

2. 코어와 멀티코어

코어(core)

 -CPU(현대적 관점) : 명령어를 실행하는 부품을 여러 개 포함하는 부품

 -코어(core): 명령어를 실행하는 부품

 

②멀티코어(multi-core)

 -멀티코어(multi-core) CPU(또는 멀티코어 프로세서) : 코어를 여러 개 포함하고 있는 CPU(듀얼코어부터)

  CPU 내에 명령어를 처리하는 일꾼이 여러 명 있는 것과 같다

코어 수 프로세서 명칭
1 싱글코어(single-core)
2 듀얼코어(dual-core)
3 트리플코어(triple-core)
4 쿼드코어(quad-core)
6 헥사코어(hexa-core)
8 옥타코어(octa-core)
10 데카코어(deca-core)
12 도데카코어(dodeca-core)

 -그러나 코어의 개수보다 코어마다 처리할 명령어들을 얼마나 적절하게 분배하느냐가 중요하다.

ex) 4인 1조 조별과제를 할 때 업무의 분담이 제대로 이뤄지지 않아 2명만 참여했을 때, 두 사람만의 생산성만큼의 결과가 나온다.

-처리하고자 하는 작업량보다 코어 수가 지나치게 많아도 성능에 크게 영향이 없다.

ex) 4인분의 도시락을 10명의 요리사가 만드는 게 5명의 요리사가 만드는 것보다 특별히 더 빠르지 않다.

3. 스레드와 멀티 스레드

 스레드

 -스레드(thread)의 사전적 정의 : 실행의 흐름의 단위

 -CPU에서 사용되는 하드웨어적 스레드와 프로그램에서 사용되는 소프트웨어적 스레드로 나뉜다.

 

-1 하드웨어적 스레드

 -스레드(thread)의 하드웨어적 정의  : 하나의 코어가 동시에 처리하는 명령어 단위

 -멀티스레드(multithread) 프로세서(또는 멀티스레드 CPU) : 하나의 코어로 여러 명령어를 동시에 처리하는 CPU

ex) 2코어 4스레드 CPU : 명령어를 실행하는 부품(코어)을 2개 포함하고, 한 번에 4개의 명령어를 처리할 수 있는 CPU

 -하이퍼스레딩(hyper-threading) : 인텔의 멀티스레드 기술을 칭하는 고유명 

 

-2 소프트웨어적 스레드

 -스레드(thread)의 소프트웨어적 정의 : 하나의 프로그램에서 독립적으로 실행되는 단위

 -하나의 프로그램은 한 스레드만 실행될 수도 있지만, 여러 부분이 동시에 실행될 수도 있다.

 -1코어 1스레드 CPU라도 소프트웨어적 스레드를 수십 개 실행할 수 있다.

더보기

소프트웨어적 스레드는 프로그래밍 언어를 이용하여 만들 수 있다.

Java를 배우면서 조금 복잡한 프로그램을 프로그래밍할 때는 스레드를 관리해주지 않으면 의도와 다른 결과가 나오기 때문에, 스레드에 대한 이해와 스레드 핸들링을 잘 익히는 것이 중요하다.   

 

 멀티스레드 프로세서 

용어 혼동을 방지하기 위하여 소프트웨어적 스레드는 스레드, CPU에서 사용되는 스레드는 하드웨어 스레드로 지칭한다.

편의상 꼭 필요한 레지스터들의 모음을 '레지스터 세트'로 지칭했다.

 -핵심은 레지스터로, 레지스터의 수를 늘리면 실행할 수 있는 명령어의 수도 늘어난다.

ex) 레지스터 세트가 1개인 CPU는 한 개의 명령어를 처리하기 위한 정보들을 기억하지만, 레지스터 세트가 2개인 CPU는 두 개의 명령어를 처리하기 위한 정보들을 기억할 수 있다.  

 -프로그램의 입장에서는 2코어 4스레드 CPU가 CPU가 4개 있는 것처럼 보여서, 하드웨어 스레드를 논리 프로세서(logical processor)라고 부르기도 한다. 

ex)  위의 그림에서 코어는 2개지만, 논리 프로세서는 4개로 나온다.  


확인문제

 

1. ③, 클럭 신호가 높아지면 컴퓨터 부품은 발열이 일어난다.

2. ④, 멀티스레드 프로세서는 하나의 코어로도 여러 개의 스레드를 처리할 수 있다.

3. ① 하드웨어, ② 소프트웨어

(기본미션)4. 코어


05-2 명령어 병렬 처리 기법(ILP; Instruction-Level Parallelism)

1. 명령어 파이프라인

①명령어 처리 과정

1. 명령어 인출(Instruction Fetch)
2. 명령어 해석(Instruction Decode)
3. 명령어 실행(Execute Instruction)
4. 결과 저장(Write Back)

 ▲책에 따라 명령어 인출→명령어 실행, 또는 명령어 인출→명령어 해석→명령어 실행→메모리 접근→결과 저장으로 나누기도 한다.

 -CPU는 같은 단계가 겹치지만 않는다면 각 단계를 동시에 실행할 수 있다.

ex) 한 명령어를 '인출'하는 동안 다른 명령어를 '실행'할 수 있고, 한 명령어가 '실행'되는 동안에 연산 결과를 '저장'할 수 있다.  

 

명령어 파이프라이닝(instruction pipelining)

 -명령어들을 명령어 파이프라인(instruction pipeline)에 넣고 동시에 처리하는 기법

명령어 파이프라이닝

②-1 파이프라인 위험(pipeline hazard)

 -특정 상황에서 파이프라이닝이 성능 향상에 실패하는 경우

 -데이터 위험, 제어 위험, 구조적 위험이 있다. 

 

②-1-1 데이터 위험(data hazard)

 -데이터 의존적인 두 명령어를 무작정 동시에 실행하려고 할 때 파이프라인이 제대로 작동하지 않는 것

 -명령어간 '데이터 의존성'에 의해 발생한다.

ex) 편의상 레지스터 R1, R2, R3, R4, R5가 있고 '왼쪽 레지스터에 오른쪽 결과를 저장하라'는 ←기호로 표기 

 명령어 1: R1←R2+R3

 명령어 2: R4R1+R5

 명령어 2는 명령어 1의 데이터에 의존적이고, 명령어 1의 수행이 끝나 R1에 결괏값이 저장되어야만, 명령어 2가 수행 가능하다.

 

②-1-2 제어 위험(control hazard)

 -프로그램 실행 흐름이 바뀌어 명령어가 실행되면서 프로그램 카운터 값에 갑작스러운 변화가 생겼을 때 명령어 파이프라인에 미리 가지고 와서 처리 중이었던 명령어들이 아무 쓸모 없어지는 것 

 -주로 분기 등으로 인한 '프로그램 카운터의 갑작스러운 변화'에 의해 발생한다.

ex) 10번지, 11번지, 12번지의 명령어를 파이프라인에 넣고 동시에 처리 중이었는데 10번지 명령어를 실행해 보니, 60번지로 분기해야 해서 11번지, 12번지 명령어의 처리가 필요 없어지는 경우

 -이를 위해 사용하는 기술인 분기 예측(branch prediction) : 프로그램이 어디로 분기할지 미리 예측하여 그 주소를 인출하는 기술

 

②-1-3 구조적 위험(structural hazard)

 -명령어들을 겹쳐 실행하는 과정에서 서로 다른 명령어가 동시에 ALU, 레지스터 등과 같은 CPU 부품을 사용하려고 하는 것

 -자원 위험(resource hazard)라고도 부른다.

 

2. 슈퍼스칼라

슈퍼스칼라(superscalar)

 -CPU 내부에 여러 개의 명령어 파이프 라인을 포함한 구조

슈퍼스칼라

 -슈퍼스칼라 프로세서(또는 슈퍼스칼라 CPU) : 슈퍼스칼라 구조로 명령어 처리가 가능한 CPU

  매 클럭 주기마다 동시에 여러 명령어를 인출, 실행이 가능해야 한다. (멀티 스레드 프로세서가 슈퍼스칼라 구조를  사용할 수 있다.)

 -이론적으로는 파이프라인 개수에 비례하여 프로그램 처리 속도가 빨라지지만, 파이프라인 위험을 피하기가 까다로워 실제로는 반드시 파이프라인 개수에 비례하여 빨라지지 않는다.

 

 

3. 비순차적 명령어 처리 

비순차적 명령어 처리(OoOE; Out-of-Order Execution)

 -명령어들을 순차적으로 실행하지 않는 기법

 -비순차적 명령어 처리가 가능한 CPU는 명령어들이 어떤 명령어와 데이터 의존성을 가지고 있는지, 순서를 바꿔 실행할 수 있는 명령어에는 어떤 것들이 있는지를 판단할 수 있어야 한다.


비순차적 명령어 처리 실행 예시

소스 코드
편의상 '메모리 N번지' 는 M(N)으로,
'메모리 N번지에 M을 저장하라'는 M(N)←T로 표기
1. M(100) ← 1
2. M(101) ← 2
3. M(102) ← M(100) + M(101)
4. M(150) ← 1
5. M(151) ← 2
6. M(152) ← 3

① 3번 명령어의 경우, 1번과 2번 명령어 실행이 끝날 때까지 기다려야 하므로 실행하면 다음 그림과 같다.

② 그러나 3번 명령어는 뒤의 명령어와 순서를 바꿔서 처리해도 수행 결과에 큰 영향을 미치지 않는다.

1. M(100) ← 1
2. M(101) ← 2
4. M(150) ← 1
5. M(151) ← 2
6. M(152) ← 3
3. M(102) ← M(100) + M(101)

→이처럼 순서를 바꿔 실행해도 무방한 명령어를 먼저 실행하여 명령어 파이프라인이 멈추는 것을 방지하는 기법이 비순차적 명령어 처리 기법이다. 


확인문제

1. ②, 슈퍼스칼라는 여러 개의 명령어 파이프라인을 이용하여 명령어를 처리하는 기법이다. 공장 생산 라인을 여러 개 두는 것과 흡사하다. 

2. ① 비순차적명령어 처리, ② 슈퍼스칼라


05-3 CISC와 RISC

1. 명령어 집합

명령어 집합(instruction set 또는 명령어 집합 구조(ISA; Instruction Set Architecture)

'구조'라는 단어가 붙은 이유는 CPU가 이해하는 명령어에 따라 컴퓨터 구조 및 설계 방식이 달라지기 때문이다. 

 -CPU가 이해할 수 있는 명령어들의 모음

 -CPU마다 ISA가 다를 수 있다.

 -ISA가 같은 CPU끼리는 서로의 명령어를 이해할 수 있지만, ISA가 다르다면 서로의 명령어를 이해할 수 없다. 일종의 CPU 언어인 셈

ex) 노트북 속 CPU는 x86(32비트용 ISA) 또는 x86-64(64비트용 ISA) ISA를 이해하지만, 아이폰 속 CPU는 ARM ISA를 이해한다.

    따라서 노트북과 아이폰은 서로의 명령어를 이해할 수 없다. 

 -ISA가 달라지면

 : CPU가 이해할 수 있는 명령어와 어셈블어가 달라진다.

 : 제어장치가 명령어를 해석하는 방식, 사용되는 레지스터의 종류와 개수, 메모리 관리 방법 등 많은 것이 달라진다.

 

ISA는 CPU의 언어이자, 하드웨어가 소프트웨어를 어떻게 이해할지에 대한 약속이다.

 

2. CISC

CISC(Complex Instruction Set Computer)

 -약자의 직역 : 복잡한 명령어 집합을 활용하는 컴퓨터(CPU)

ex) x86, x86-64가 대표적인 CISC 기반의 ISA이다.

 -CISC는 다양하고 강력한 ISA를 활용하기 때문에 명령어의 형태와 크기가 다양한 가변 길이 명령어를 활용한다.

 -메모리에 접근하는 주소 지정 방식도 다양하여 특별한 상황에만 사용되는 독특한 주소 지정 방식들도 있다.

 -다양하고 강력한 명령어를 활용한다. = 상대적으로 적은 수의 명령어로 프로그램을 실행할 수 있다. = 컴파일된 프로그램의 크기가 작다.

 

장점

 -적은 수의 명령어로 프로그램을 실행하기 때문에 메모리 공간을 절약할 수 있다.

 

단점

 -활용하는 명령어가 복잡하고 다양한 기능을 제공하여 실행되기까지의 시간이 일정하지 않다. 

 -복잡한 명령어 하나를 실행하는데에 여러 클럭 주기가 필요하다.

→ 파이프 라인이 효율적으로 명령어를 처리할 수 없다.  

 -복잡하고 다양한 명령어는 사용 빈도가 낮고, 자주 사용되는 명령어만 사용된다.

 

3. RISC

RISC(Reduced Instruction Set Computer)

 -CISC의 한계를 개선하여, 짧고 규격화된 명령어, 되도록 1클럭 내외로 실행되는 명령어를 지향한다.

 -단순하고 적은 수의 고정 길이 명령어 집합을 활용한다.

→ 파이프 라이닝에 최적화 되어 있다.

 -메모리에 접근하는 명령어를 load, store 두 개로 제한하여 메모리 접근을 단순화하고 최소화를 추구한다.(load-store 구조)

메모리에 접근하는 주소 지정 방식이 CISC보다 적은 경우가 많다. 

 -메모리 접근을 단순화, 최소화 하는 대신 레지스터를 적극 활용하여 CISC보다 레지스터를 이용하는 연산과 범용 레지스터의 개수가 더 많다.

 -단순하고 적은 명령어를 활용한다. = 상대적으로 많은 수의 명령어로 프로그램을 실행한다. = 컴파일된 프로그램의 크기가 크다.

 

  CISC RISC
명령어의 형태와 개수 복잡하고 다양한 명령어 단순하고 적은 명령어
사용 명령어 길이 가변 길이 명령어 고정 길이 명령어
주소 지정 방식 다양하다 적다
프로그램을 이루는 명령어의 수 적다
(컴파일 된 프로그램의 크기가 작다)
많다
(컴파일 된 프로그램의 크기가 크다)
명령어 수행 시간 여러 클럭 1클럭 내외
파이프라이닝의 적용 어렵다 쉽다

확인문제

1. ④, CISC는 명령어 주소 지정 방식의 종류가 많다. 

2. ①, RISC는 CISC보다 프로그램을 실행하는 명령어 수가 많다.