빠른 CPU를 위한 설계 기법 - 컴퓨터 구조 수업 과제

김은서·2023년 11월 30일
2
post-thumbnail

클럭, 멀티코어, 멀티스레드가 무엇인지 알아보고, 이들이 CPU 속도와 어떤 관계가 있는지 알아봅시다.


클럭

클럭이란?

클럭이란 컴퓨터의 보든 부품을 일사분란하게 움직일 수 있게 하는 시간 단위 입니다. 클럭의 주기에 맞춰 한 레지스터에서 다른 레지스터로 데이터가 이동되거나, ALU에서 연산이 수행되거나, CPU가 메모리에 저장된 명령어를 읽어 들이는 것이지요.

명령어 사이클이란?

여러분이 실행하는 프로그램은 수많은 명령어로 이루어져 있고, CPU는 이 명령어들을 하나씩 실행합니다. 이때 프로그램 속 각각의 명령어들은 일정한 주기가 반복되며 실행되는데, 이 주기를 명령어 사이클instruction cycle이라고 합니다.

클럭 속도

클럭 속도는 헤르츠(Hz)단위로 측정합니다. 이는 1초에 클럭이 몇 번 반복되는지를 나타냅니다. 가령 클럭이 1초에 한 번 반복되면 CPU 클럭 속도는 1Hz인 것이고, 클럭이 1초에 100번 반복되면 CPU 클럭 속도는 100Hz인 것입니다.

생각해 보죠. 클럭신호가 빠르게 반복되면 CPU를 비롯한 컴퓨터 부품들은 그만큼 빠른 박자에 맞춰 움직이겠죠? 즉, 클럭 속도가 높아지면 CPU는 명령어 사이클을 더 빠르게 반복할 것이고, 다른 부품들도 그에 발맞춰 더 빠르게 작동할 것입니다.

CPU가 명령을 얼마나 빠르게 불러오고 해석하는지는 프로세서 클럭 속도가 결정합니다. 그래서 클럭 속도는 CPU 속도 단위로 간주되기도 합니다.

클럭의 속도는 일정하지 않다

클럭의 속도는 일정하게 유지되지 않습니다. CPU는 계속 일정한 클럭 속도를 유지하기보다는 고성능이 필요한 순간에는 순간적으로 클럭 속도를 높이고, 그렇지 않을 때는 유연하게 클럭 속도를 낮추기도 합니다. 최대 클럭 속도를 강제로 더 끌어올릴 수도 있는데 이런 기법을 오버클럭킹overclocking이라고 합니다.

클럭 속도를 무지막지하게 올린다면?

클럭 속도를 무지막지하게 높이면 무조건 CPU가 빨라질까요?

안타깝게도 그렇지는 않습니다. 그래픽이 많이 요구되는 게임이나 영상 편집과 같이 CPU에 무리가 가는 작업을 장시간 하면 컴퓨터가 뜨겁게 달아오르는 것을 경험해 본 적이 있을 겁니다. 클럭 속도를 무작정 높이면 이러한 발열 문제가 더욱 심각해집니다.

이처럼 클럭 속도를 높이는 것은 분명 CPU를 빠르게 만들지만, 클럭 속도만으로 CPU의 성능을 올리는 것에는 한계가 있습니다.


코어와 멀티코어

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

CPU를 '명령어를 실행하는 부품'이라고 합니다. 전통적으로 '명령어를 실행하는 부품'은 원칙적으로 하나만 존재했습니다. 하지만 오늘날 CPU는 많은 기술적 발전을 거듭하였고, 그 결과 CPU 내부에는 '명령어를 실행하는 부품'을 얼마든지 만들 수 있게 되었습니다.

우리가 지금까지 CPU의 정의로 알고있었던'명령어를 실행하는 부품'은 오늘날 코어core라는 용어로 사용됩니다. 오늘날의 CPU는 단순히 '명령어를 실행하는 부품'에서 '명령어를 실행하는 부품을 여러 개 포함하는 부품'으로 명칭의 범위가 확장되었습니다.

코어를 여러 개 포함하고 있는 CPU를 멀티코어multi-core CPU 또는 멀티코어 프로세서라고 부릅니다. 당연한 말이지만 멀티 코어의 처리 속도는 단일 코어보다 빠름니다.

그럼 코어를 두 개, 세 개, 100개로 늘리면 연산 처리 속도도 두 배, 세 배, 100배로 빨라질까요? 안타깝게도 CPU의 연산 속도가 꼭 코어 수에 비례하여 증가하지는 않습니다. 코어마다 처리할 연산이 적절히 분배되지 않는다면 코어 수에 비례하여 연산 속도가 증가하지 않습니다. 또한 처리하고자하는 작업량보다 코어 수가 지나치게 많아도 성능에는 크게 영향이 없습니다.

중요한 것은 코어마다 처리할 명령어들을 얼마나 적절하게 분배하느냐이고 그에 따라서 연산 속도는 크게 달라집니다.

스레드와 멀티스레드

스레드의 사전적 의미는 '실행 흐름의 단위'입니다.

스레드에는 CPU에서 사용되는 하드웨어적 스레드가 있고, 프로그램에서 사용되는 소프트웨어적 스레드가 있습니다. 지금부터 하드웨어적 스레드와 소프트웨어적 스레드가 어떻게 다른지 설명하겠습니다.

하드웨어적 스레드

스레드를 하드웨어적으로 정의하면 '하나의 코어가 동시에 처리하는 명령어의 단위'를 의미합니다.

1코어 1스레드 CPU는 명령어를 실행하는 부품이 하나있고, 한 번에 하나씩 명령어를 실행합니다.

반면, 여러 스레드를 지원하는 CPU는 하나의 코어로도 여러개의 명령어를 동시에 실행할 수 있습니다. 예를 들어 2코어 4스레드 CPU는 아래 그림처럼명령어를 실해하는 부품을 두 개 포함하고 한 번에 네개의 명령어를 처리할 수 있는 CPU를 말합니다.

이처럼 하나의 코어로 여러 명령어를 처리하는CPU를 멀티스레드multithread프로세서또는 멀티스레드CPU라고 합니다.

소프트웨어적 스레드

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

하나의 프로그램은 실행되는 과정에서 한 부분만 실행될 수도 있지만, 프로그램의 여러 부분이 동시에 실행될 수도 있습니다. 한 부분만 실행되는 것을 싱글스레드라고 하고, 여러 부분이 동시에 실행되는 것을 멀티스레드라고 합니다.

정리하면, 스레드의 하드웨어적 정의는 '하나의 코어가 동시에 처리하는 명령어 단위'를 의미하고, 소프트웨어적 정의는 '하나의 프로그램에서 독립적으로 실행되는 단위'를 의미합니다.

멀티스레드 프로세서

멀티스레드 프로세서는 하나의 코어로 여러 명령어를 동시에 처리하는 CPU라고 앞서 이야기 하였습니다. 어떻게 이런 일이 가능할까요?

멀티스레드 프로세서를 실제로 설계하는 일은 매우 복잡하지만, 가장 큰 핵심은 레지스터입니다. 하나의 코어로 여러 명령어를 동시에 처리하도록 만들려면 프로그램 카운터, 스택 포인터, 데이터 버퍼 레지스터, 데이터 주소 레지스터와 같이 하나의 명령어를 처리하기 위해 꼭 필요한 레지스터를 여러 개 가지고 있으면 됩니다. 프로그램 카운터가 두 개 있다면 '메모리에서 가져올 명령어 주소'를 두 개 지정할 수 있을 것이고, 스택 포인터가 두 개 있다면 두 개의 스택을 관리할 수 있습니다.

아래 그림을 보세요. 하나의 명령어를 실행하기 위해 꼭 필요한 레지스터들을 편의상 '레지스터 세트'라고 표기 하겠습니다. 레지스터 세트가 한 개인 CPU는 한 개의 명령어를 처리하기 위한 정보들을 기억할 뿐이지만, 레지스터 세트가 두 개인 CPU는 두 개의 명령어를 처리하기 위한 정보들을 기억할 수 있습니다. 여기서 ALU와 제어장치가 두 개의 레지스터 세트에 저장된 명령어를 해석하고 실행하면 하나의 코어에서 두 개의 명령어가 동시에 실행됩니다.

하드웨어 스레드를 이용해 하나의 코어로도 여러명령어를 동시에 처리할 수 있다고 이야기 하였습니다. 그러나 메모리 속 프로그램의 입장에서 봤을 때 하드웨어 스레드는 마치 '한 번에 하나의 명령어를 처리하는 CPU'나 다름없습니다. 기령 2코어 4스레드 CPU는 한 번에 네 개의 명령어를 실행할 수 있는데, 프로그램 입장에서 봤을 땐 한 번에 하나의 명령어를 처리하는 CPU가 네 개 있는 것처럼 보입니다. 그래서 하드웨어 스레드를 논리 프로세서logical processor라고 부르기도 합니다.

profile
happiness

0개의 댓글