컴퓨터 부품들은 클럭 신호에 맞춰 일사불란하게 움직이며 CPU는 명령어 사이클이라는 정해진 흐름에 맞춰 명령어들을 실행하게 된다. 따라서 일반적으로 클럭이 빠를수록 CPU 성능이 좋다. 클럭 속도는 헤르츠로 측정되며 헤르츠는 1초에 100번 반복되는 회수를 의미한다. 다만 필요 이상으로 클럭을 높이면 발열이 심각해진다.
따라서 CPU 성능을 올리기 위해 클럭속도를 늘리는 방법 외에 다른 방법이 있다.
바로 코어 수나 스레드 수를 늘리는 방법이다.
코어란?
일단 현대적인 관점에서 CPU라는 용어를 재해석 해야 하는데 CPU는 명령어를 실행하는 부품이라고 할 수 있다. 전통적으로는 명령어를 실행하는 부품이 원칙적으로 하나만 존재했지만 요즘에는 CPU에 명령어를 실행하는 부품이 여러개 존재 한다. 그래서 명령어를 실행하는 부품을 코어라는 용어로 사용한다. 그래서 CPU(코어)를 여러 개 가지고 있으면 멀티코어라고 한다.
물론 꼭 코어 수에 비례하여 성능이 증가하지는 않고 연산이 적절하게 분배 되어야 한다.
스레드와 멀티 스레드
스레드란 실행 흐름의 단위로써 하드웨어적 스레드와 소프트웨어적 스레드가 있다.
하드웨어 스레드는 하나의 코어가 동시에 처리하는 명령어 단위이다. 만약 코어가 2개에 각 코어당 명령어를 두 개씩 처리한다고 하면 해당 CPU는 2코어 4스레드 CPU이다. 이처럼 하나의 코어가 여러 스레드를 가지고 있는 CPU를 멀티 스레드 프로세서, 멀티 스레드 CPU라고 한다. 하드웨어 스레드는 논리 프로세서라고도 부른다.
소프트웨어 스레드는 하나의 프로그램에서 독립적으로 실행되는 단위이다. 즉 하나의 메모리에서 스레드가 여러 개 돌아가면 멀티스레드, 하나만 돌아가면 싱글스레드이다.
명령어 파이프라인
명령어가 처리되는 과정은 명령어 인출, 명령어 해석, 명령어 실행, 결과 저장으로 나눌 수 있다. 같은 단계가 겹치지만 않는다면 CPU는 각 단계를 동시에 실행할 수 있다. 즉 명령어 파이프라이닝은 동시에 여러 개의 명령어를 겹쳐서 실행하는 방법이다.
명령어 파이프라인이 성능향상에 실패하는 경우도 있는데 다음과 같다.
데이터 위험 : 명령어 간의 의존생에 의해 야기 되는데 이전 명령어를 끝까지 실행해야만 비로소 실행할 수 있는 경우에 발생한다.
제어 위험 : 프로그램 카운터의 갑작스러운 변화에 의해 야기된다.
구조 위험 : 서로 다른 명령어가 같은 CPU 부품(ALU, 레지스터)를 쓰려고 할 때 야기된다.
슈퍼스칼라
슈퍼스칼라는 CPU 내부에 여러 개의 명령어 파이프라인을 포함한 구조이며(오늘날의 멀티 프로세서) 이론적으론 파이프라인 개수에 비례하여 처리 속도가 증가하겠지만 파이프라인 위험도의 증가로 인해 파이프라인 개수에 속도가 비례하지는 않는다.
비순차적 명령어 처리
비순차적 명령어 처리 기법은 파이프라인의 중단을 방지하기 위해 명령어를 순차적으로 처리하지 않는 명령어 병렬 처리 기법이다. 이 때 의존성이 없는 명령어를 먼저 수행하며 의존성이 없는 것만 순서를 바꿀 수 있다.
명령어 집합구조, CISC와 RISC
명령어집합구조는 CPU가 이해할 수 있는 명령어들의 모음이다. 이는 CPU의 언어인 셈이다. 만약 인텔 CPU 컴퓨터에서 만든 실행 파일을 그대로 아이폰에 옮겨 특별한 설정 없이 바로 실행하면 명령어 집합이 다르기 때문에 실행이 되지 않는다. 명령어가 달라지면 명령어 해석 방식, 레지스터의 종류와 개수, 파이프라이닝의 용이성 등 많은 부분이 달라진다. 즉 하드웨어가 소프트웨어를 어떻게 이해할지에 대한 약속이라고 할 수 있다.
CISC
복잡하고 다양한 명령어를 활용한다. 명령어의 형태와 크기가 다양한 가변 길이 명령어를 활용하는데 강력하고 다양한 명령어를 제공하며 상대적으로 적은 수의 명령어로도 프로그램을 실행할 수 있다. 다만 메모리를 최대한 아끼며 개발해야 했던 시절에는 인기가 높았으나 명령어 파이프라이닝이 불리하다는 치명적인 단점이 있었고 명령어가 워낙 복잡하고 다양한 기능을 제공하는 탓에 명령어의 크기와 실행되기까지의 시간이 일정하지 않았다. 그리고 복잡한 명령어 때문에 명령어 하나를 실행하는데에 여러 클럭 주기가 필요하다.
RISC
RISC는 단순하고 적은 수의 고정 길이 명령어 집합을 활용한다. 종류가 적고 짧고 규격화된 명령어를 사용한다. 메모리 접근을 최소화 하고 레지스터를 십분 활용한다. 따라서 1클럭 내외로 명령어 수행이 가능하며 파이프라이닝하기 쉽다. 다만 명령어 종류가 CISC보다 적기 때문에 컴파일 했을 때 더 많은 명령어가 나올 수도 있다.
'CS' 카테고리의 다른 글
[CS] 컴퓨터 구조 (7) 보조기억장치 (0) | 2023.07.06 |
---|---|
[CS] 컴퓨터 구조 (6) 메모리와 캐시 메모리 (0) | 2023.07.05 |
[CS] 컴퓨터 구조 (4) ALU와 제어장치 (0) | 2023.06.27 |
[CS] 컴퓨터 구조 (3) CPU의 작동 원리 (0) | 2023.06.15 |
[CS] 컴퓨터 구조 (2) 데이터와 명령어 (0) | 2023.06.15 |