📢 본 글은 혼공학습단 미션과 함께 정리해보는 글 입니다.
CPU를 빠르게 하기 위한 방법으로는 클럭 속도를 높이는 방법
이 있다.
컴퓨터 부품들은 클럭 신호에 맞춰 명령어 사이클이 진행되는데, 클럭 속도가 높아진다면 진행할 수 있는 명령어 사이클 횟수가 늘어날 것이기 때문이다.
클럭 속도의 단위는 헤르츠 (Hz)
이다. 헤르츠는 1초에 클럭이 반복되는 횟수
를 뜻한다.
또한 클럭 속도는 일정하지 않다. 필요한 작업량에 따라서 유연하게 조절되며, 최대 클럭 속도를 강제로 끌어올리는 방법
을 오버클럭킹 (overclocking)
이라고 한다.
클럭 속도를 너무 극단적으로 높이다보면 발열 문제
를 초래한다.
코어 (Core)
란 명령어를 실행하는 부품
을 뜻한다.
원래 CPU의 뜻이었으나, 기술 발전으로 현대 CPU에는 명령어를 실행하는 부품이 여러 개 존재할 수 있게 되었다. 이때 여러 개의 코어
를 가지고 있는 것을 멀티 코어 (= 멀티 코어 프로세서)
, 하나의 코어
를 가지고 있는 것을 싱글 코어 (= 싱글 코어 프로세서)
라고 한다.
CPU의 연산 속도가 무조건 코어 수에 비례하여 증가하지는 않는다. 또한 처리하고자 하는 작업량보다 너무 코어가 많아도 성능에는 크게 영향이 없다. 더 중요한 것은 코어마다의 처리해야 할 연산이 적절히 분배되는 것
이다.
스레드 (Thread)란 실행 흐름의 단위
를 의미하지만, CPU에서의 스레드와 프로그래밍에서의 스레드는 의미가 약간 다르다.
하드웨어적 스레드는 하나의 코어가 동시에 처리하는 명령어 단위
를 뜻한다. 하나의 코어가 하나의 명령어를 처리한다면 1코어 1스레드 CPU라 한다.
그런데 2코어 4스레드처럼, 하나의 코어에서 여러 개의 명령어를 동시에 처리
할 수도 있다. 이러한 경우를 멀티 스레드 프로세서
라 한다.
하나의 코어가 레지스터 세트
(하나의 명령어를 실행하기 위해 꼭 필요한 레지스터들의 모음)를 여러 개 가지고 있으면 하나의 코어에서 여러 명령어를 동시에 처리
할 수 있다.
하드웨어 스레드를 논리 프로세서 (logical processor)
라고 하기도 한다. 메모리가 보기에는 하드웨어 스레드가 한 번에 하나의 명령어를 처리할 수 있는 CPU처럼 보이기 때문
이다.
소프트웨어적 스레드는 하나의 프로그램에서 독립적으로 실행되는 단위
를 뜻한다. 워드 프로그램에서는 맞춤법 검사, 저장 등의 기능이 동시에 실행된다.
즉, 소프트웨어 스레드를 여러 개 만들면 하나의 프로그램에서 독립적으로 실행되는 게 많아져서 하나의 프로그램의 여러 군데를 동시에 실행할 수 있다.
여기서 중요한 것은 1코어 1스레드 CPU도 여러 개의 소프트웨어 스레드를 만들 수 있다.
CPU는 프로그램을 실행할 때 매우 빠르게 번갈아가며 실행하기 때문에 사용자 눈에는 동시에 실행되는 것 처럼 보이기 때문이다.
CPU를 빠르게 만드는 것도 중요하지만, CPU의 유휴 시간 (대기 시간)을 줄이고 최대한 효율적으로 작동할 수 있도록 하는 것도 중요하다.
이때 쓰이는 기법이 명령어 병렬 처리 기법 (ILP)
이며, 대표적인 명령어 병렬 처리 기법에는 명령어 파이프라이닝, 슈퍼스칼라, 비순차적 명령어 처리가 있다.
현대 컴퓨터에서 없어서는 안될 개념이다.
명령어가 처리되는 과정을 비슷한 시간 간격으로 나누면 명령어 인출 → 명령어 해석 → 명령어 실행 → 결과 저장
으로 된다.
그런데, 각 단계가 겹치지 않게 된다면 CPU는 각 단계를 동시에 실행할 수 있다.
이와 같이 명령어들을 공장 생산 라인과 같은 파이프라인에 넣고 동시에 처리하는 기법을 명령어 파이프라이닝이라 한다.
특정 상황에서는 성능 향상에 실패하는 경우도 있다. (= 파이프라인 위험)
특정 명령어는 이전 명령어를 끝까지 실행해야만 실행
할 수 있는 경우가 있다.명령어 간 데이터 의존성
에 의해 발생한다.그동안 진행되고 있던 다음 명령어들이 쓸모없게 되는 경우
를 뜻한다.미리 프로그램 카운터의 다음 값을 예측
하는 것 (프로그램이 어디로 분기할지 미리 예측하는 것)을 분기 예측
이라 한다.명령어들을 겹쳐 실행하는 과정에서 각 명령어들이 동시에 같은 CPU 부품을 사용하려고 할 때 발생한다.
슈퍼스칼라는 CPU 내부에 여러 개의 명령어 파이프라인을 가진 것
을 뜻한다.
이 구조로 명령어 처리가 가능한 CPU를 슈퍼스칼라 프로세서 (= 슈퍼스칼라 CPU)
라고 하지만, 단일 파이프라인을 가졌을 때 보다 더 파이프라인 위험 등에 대해 엄격하게 처리
되어야 하므로 까다로운 구조이다. 그렇기 때문에 이론적으로는 파이프라인 갯수에 비례하여 성능이 좋아지지만, 실제로는 반드시 파이프라인 갯수에 비례하지 않는다.
파이프라인의 중단을 방지하기 위해 명령어를 순차적으로 처리하지 않는 명령어 병렬 처리 기법
을 뜻한다.
앞서 말했던 파이프라이닝 위험을 줄이는 데 기여하며, 서로 간의 순서를 바꾸기 위해서는 서로 간의 데이터 의존성이 전혀 없어야 한다.
명령어 파이프라이닝을 활용함으로써 명령어들을 병렬 처리할 수 있다고 하였다.
그렇다면 명령어 파이프라이닝을 어떻게 더 좋게 할 수 있을까? 어떻게 더 명령어 파이프라이닝에 최적화되어 있어야 할까?
결국 명령어의 구조가 명령어 파이프라이닝을 할 때 유리하게 생겨야 한다.
CPU가 이해할 수 있는 명령어들의 모음
을 뜻한다.
세상에는 많은 종류의 CPU가 있고, 이들이 이해하는 명령어들의 구조는 제각기 다르다.
또는 명령어 집합 구조 (ISA, Instruction Set Architecture)
라고 한다.
즉 명령어 집합은 CPU간 소통할 수 있는 언어
이기도 하다. 이게 다르다면 명령어를 해석하는 방식, 레지스터의 종류와 갯수 등이 다 달라지게 된다.
가변 길이 명령어
활용명령어의 크기와 실행되기까지의 시간이 일정하지 않게 됨
명령어 파이프라이닝에 불리함
짧고 규격화된 명령어
를 사용한다. → 고정 길이 명령어
활용특징 | CISC | RISC |
---|---|---|
명령어 | 복잡, 다양 | 단순, 적음 |
명렁어 길이 | 가변 | 고정 |
주소 지정 방식 | 다양 | 적음 |
프로그램을 이루는 명령어의 수 | 적음 | 많음 |
명령어 처리 클럭 | 여러 클럭 필요 | 1클럭 내외 |
파이프라이닝에 유리/불리 | 불리 | 유리 |
명령어 파이프라이닝을 사용하는 것은 현대 컴퓨터에서 너무 중요하기 때문에 CISC 제조업체는 실제로 실행될 때 CPU 내부적으로 조금 더 잘게 쪼개서 실행되도록 한다. (마이크로 명령어) 그래서 CISC 구조라 하더라도 실제 CPU를 보면 내부적으로는 RISC처럼 처리되도록 하고 있다.
코어
이다. 연산을 위한 ALU, 제어 신호를 보내기 위한 제어장치, 메모리와 소통하기 위한 레지스터를 가지고 있는 집합 (즉, 명령어를 실행하는 부품)을 코어라고 한다.부족하거나 보완할 점이 있다면 댓글 부탁드립니다 😃