컴퓨터 구조-CPU 성능에 관한 것들

김명재·2023년 4월 9일
0
post-thumbnail

과거 CPU의 성능을 더욱 개선하기 위하여 여러가지 개념들이 등장하거나 기존의 것들의 성능을 더욱 높이는 방식으로 이루어 졌다.

지금부터 어떻게 기존 성능을 개선하거나 또는 어떤 새로운 개념이 등장하였는지 알아보자!!!

클럭

클럭이란 컴퓨터의 모든 부품들이 일사불란하게 움직일 수 있게 하는 시간 단위이다. 클럭의 단위에 맞춰 한 레지스터에서 다른 레지스터로 데이터가 이동하거나, ALU에서 연산이 수행되거나 한다.

즉 컴퓨터의 모든 부품이 클럭 신호에 맞춰 작동한다는 것이다.

그래서 이런 클럭의 신호가 빠르게 반복되면 CPU를 비롯한 컴퓨터 부품들은 그만큼 빠른 박자에 맞춰 움직일 것이다.

클럭의 신호의 빠름을 더욱 정량적으로 확인할 수 있는 방법이 바로 클럭 속도를 확인하는 것이다.

클럭 속도는 헤르츠(Hz)단위로 측정한다. 보통 cpu는 nGHz이다.
즉 1초에 n X 10억 번 반복된다는 말이다.

그렇다고 클럭속도를 무작정 높인다고 무조건 CPU가 빨라질까?

실제로는 그렇지 않다. 클럭 속도를 무작정 높이면 발열문제가 발생하고 클럭 속도만으로 CPU의 성능을 올리는 것은 한계가 있다.

CPU의 성능을 높이는데 클럭 뿐만 있는것이 아니다. 그중 해결책의 하나가 바로CPU의 코어와 스레드 수를 늘리는 것이다.

코어(Core)

우선 코어 먼저 살펴보면

우선 코어를 이해하려면 현대적인 관점에서 CPU라는 용어를 재해석해야한다.

대부분 전공서적에서는 명령어를 실행하는 부품은 원칙적으로 하나만 존재한다고 한다.

그러나 오늘날 CPU는 많은 기술적 발전을 거듭했고, 그 결과 CPU 내부에 명령어를 실행하는 부품을 얼마든지 만들 수 있게 되었다.

그렇게 오늘날 CPU내부에 얼마든지 만들 수 있는 명령어를 실행하는 부품을 바로 코어라고 한다.

코어는 우리가 이전에 같이 알아본 ALU, 레지스터, 제어장치 등으로 이루어져 있다.

그래서 요즘에는 CPU에 여러개의 코어를 넣을 수 있기때문에 CPU사양에 8코어 10코어 이렇게 다양한 수의 코어가 있는 것들을 확인할 수 있다.

그러면 코어수를 계속 늘리면 거기에 맞춰 연산 처리 속도도 비례하여 증가할까?

이번에도 답은 '그렇지 않다' 이다.

코어수가 늘어나도 코어마다 처리할 연산이 적절히 분배되지 않으면 코어 수가 아무리 많아져도 연산 속도는 코어 수에 비례하여 증가하지 않는다.

스레드(Thread)

이번에는 스레드에 대해 알아보자.

우선 이번에도 스레드의 정의에 대한 개념을 정리 할 필요가 있다.

스레드는

  • 하드웨어적 스레드

  • 소프트웨어적 스레드

이렇게 두가지 종류의 스레드가 존재한다.

하드웨어적 스레드

스레드를 하드웨어적으로 정의하면 하나의 코어가 동시에 처리하는 명령어를 의미한다. CPU와 관련된 스레드는 모드 하드웨어적 스레드를 의마한다고 보면 된다.

우리가 이전 cpu의 구성요소를 알아볼때의 CPU는 1코어 1스레드였다.

즉 명령어를 실행하는 부품이 하나있고 한번에 하나씩 명령어를 실행하는 CPU였다는 것이다.

그렇지만 여러 스레드를 지원하는 CPU는 하나의 코어로 여러개의 명령어를 동시에 실행할 수 있다.

예를 들어서 설명하면 2코어 4스레드 CPU는 명령어를 처리할 수 있는 부품이 2개가 있고 한번에 4개의 명령어를 처리할 수 있는 CPU를 의미한다.(한코어당 2개의 명령어를 처리할 수 있는 것)

참고로 하나의 코어로 여러 명령어를 동시에 처리하는 CPU를 멀티스레드프로세서라고 말한다.

그렇다면 코어는 어떻게 한번에 여러 명령어를 처리할 수 있을까?

멀티프로세서의 핵심은 바로 레지스터이다. CPU가 명령어를 수행하기 위해 꼭 필요한 레지스터들이 있다.(프로그램 카운터, 데이터 버퍼 레지스터 등등) 이러한 레지스터들을 여러개 만들면 된다.

그런데 메모리 속 프로그램 입장에서 봤을 때 하드웨어 스레드는 마치 한번에 하나의 명령어를 처리하는 CPU나 다름없다. 그래서 만약 2코어4스레드의 CPU가 있을 때 프로그램 입장에서 봤을 때 하나의 명령어를 처리하는 CPU가 4개 있는 것 처럼 보인다. 그래서 하드웨어 스레드를 논리 프로세서라고도 부른다.

소프트웨어적 스레드

소프트웨어적으로 정의된 스레드는 '하나의 프로그램에서 독립적으로 실행되는 단위'를 의미한다.

(보통 소프트웨어적 스레드는 운영체제를 다룰때 등장하기 때문에 더욱 자세한 설명은 차후에 설명할 운영체제에 대한 설명을 할 때 더욱 자세히 설명하도록 하겠다.)


지금까지 CPU의 성능을 높이기 위해 클럭, 코어, 스레드를 알아봤다. 이렇게 CPU의 성능을 끌어올리기 위해서 높은 클럭의 속도, 다중 코어, 다중 스레드를 지원하는 CPU를 만드는 것도 중요하지만 CPU가 놀지않고 시간을 알뜰하게 쓰며 동작하게 하는 것도 중요하다.

그래서 이번에는 명령어를 동시에 처리하는 방법을 통해 CPU가 한시도 쉬지않고 작동시키는 기법인 명령어 병렬 처리 기럽을 소개하려고 한다.

명령어 병렬 처리 기법

  • 명령어 파이프라이닝

  • 슈퍼스칼라

  • 비순차적 명령어 처리

명령어 병렬 처리 기법으로 이렇게 3가지가 있다.

명령어 파이프라이닝

명령어 파이프라인을 이해하기 위해 명령어를 처리 할 때 전체 과정을 비슷한 시간 간격으로 나누어 보아야 한다.

명령어를 처리하는 과정을 클럭 단위로 나누어 보면

1.명령어 인출(Instruction Fetch)

2.명령어 해석(Instruction Decode)

3.명령어 실행(Execute Instruction)

4.결과 저장(Write Back)

이러한 단계를 거친다.

💥 여기서 중요한 점은 단계가 겹치지만 않는다면 CPU는 각 단계를 동시에 실행 할 수 있다.

그래서 위 사진처럼 각 시작지점에서 각 단계가 겹치지만 않게 명령어를 실행하면 하나의 명령어가 다 끝나서 실행하는 순차적인 방법보다 훨씬 효율적으로 명령어를 처리할 수 있다.

이렇게 하나의 명령어가 끝날때까지 기다렸다가 다음 명령어를 실행하는 것이 아닌 거의 동시에 여러 명령어를 처리하는 기법을 바로 명령어 파이프라인이라고 한다.

그러나 파이프라이닝은 파이프라인 위험이라는 성능 항샹에 실패하는 상황을 직면 할 수도 있다.

파이프라이닝은 총 3가지 위험으로 나뉜다.

  • 데이터 위험
    어떤 명령어는 이전 명령어를 끝까지 실행해야만 비로소 실행할 수 있는 경우가 있다. 이렇게 이전 데이터의 의존적인 명령어를 실행할 때 발생할 수 있는 위험이 데이터 위험이다.

  • 제어 위험
    프로그램 실행 흐름이 프로그램 카운터값이 갑작스럽게 바뀌면 명령어 파이프라인에 미리 가지고 와서 처리 중이었던 명령어들은 아무 쓸모가 없어진다. 이를 제어 위험이라고 한다.

  • 자원 위험
    서로 다른 명령어가 동시에 ALU,레지스터 등과 같은 CPU부품을 사용하려고 할 때 발생하는 위험을 자원 위험이라고 한다.

슈퍼스칼라

파이프라인 기법은 단일 파이프라인으로도 구현이 가능하지만 여러개의 파이프라인을 이용할 수도 있다. 이처럼 CPU 내부에 여러 파이프라인을 포함한 구조를 슈퍼스칼라라고 합니다.

그러나 슈퍼스칼라 기법을 이용하면 하나의 파이프라인을 사용할 때 보다 더 파이프라인 위험을 다루기 까다로워진다는 단점이 있다.

비순차적 명령어 처리(OoOE)

이름에 그대로 나와있듯이 비순차적으로(새치기 가능)명령어를 처리한다는 얘기이다.

아까 파이프라인 위험중 데이터 위험에서 명령어A가 다 끝나야지 그 다음 명령어B를 실행할 수 있는 상황이 있었다.

그렇다면 명령어B를 실행하기 위해서는 명령어A가 다 끝날 때까지 기다려야 하고 그 기다려야 하는 시간동안 명령어B 이후에 들어온 다른 명령어들은 계속 기다려야 한다.

이런 비효율적인 방법을 없애기 위해 비순차적 명령어 처리 기법을 사용하는 것이다.

만약에 명령어B 이후에 명령어들이 데이터 위험요소가 없다면(데이터 의존성이 없다는 말)먼저 명령어B를 실행하지 않고 이후 명령어를 파이프라이닝 기법을 활용해서 실행한다면 훨씬 많은 시간을 더욱 절약할 수 있다.

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

profile
steadyness is all time way

0개의 댓글