CPU가 작동하는 방식과, 그로 인한 성능 계산 방법

컴퓨터는 기본적으로 source code를 cpu에 넘겨주고 연산을 한 후에 결과를 출력한다.

 

 

source code에서 cpu로 넘어가는 과정을 거치기 전에, 우리가 작성한 코드를 컴파일러를 통해 프로그래밍 언어를 어셈블리어나 기계어로 변환 후 cpu로 해당 코드를 전송한다.

 

 

이와 같은 과정을 거치지만,

컴퓨터의 종류에는 서버 컴퓨터, 개인용 컴퓨터, 임베디드 컴퓨터 등 여러 여러가지가 있다.

그에 따라 요구하는 목적과 비용/성능 또한 다른데, 이러한 컴퓨터들 모두 무어의 법칙을 기준으로 설계한다.

 

 

 

 

 

 

컴퓨터는 기본적으로 입력/출력, 메모리, 프로세서로 구성되어 있다.

 

  • 입력/출력: 사용자 인터페이스 장치(디스플레이, 키보드, 마우스 등), 저장 장치(HDD, SSD), 네트워크 어댑터
  • 메모리
    • RAM(주 메모리)
    • 캐시 메모리
    • ROM
  • 프로세서
    • 데이터 경로: 실제 데이터 처리 수행(ALU, 레지스터 등)
    • 제어 유닛: 명령어 해석 및 제어 신호 생성

 

 

 

 

실제로 컴퓨터 본체를 열어보면 아래 부품들이 들어있다.

 

 

 

 

위 그림에서 A12 프로세서 부분을 자세히 살펴보면 DDR에 대한 부분을 확인할 수 있다.

 

 

여기에서 DDR이란 Double Data Rate를 의미하며, DDR 메모리 기술로 RAM에서 데이터를 전송한다.

이것을 통해서 CPU의 clock wise 신호의 상승 및 하강 엣지에서 데이터를 전송하고, 데이터 전송 속도를 향상시킨다.

 

그래서 CPU의 성능을 향상시키고 싶다면 메모리 기술이 필수적이다. (  CPU의 clock wise 신호 )

 

 

 

 

 

 

 

그런데 소프트웨어 개발자가 저런 복잡한 하드웨어 구조 지식까지 이해하며 개발할 필요는 없다.

 

control unit에 있는 명령어 집합 구조 ISA를 통해 복잡한 하드웨어 구조를 추상화하여 개발자에게 필요한 인터페이스만 제공하기 때문이다.

 

추가로, ISA의 추상화 덕분에 하드웨어의 변경에도 소프트웨어의 호환성을 유지할 수 있다.

 

 

 

 

 

 

다시 돌아와서, 프로그램의 실행 속도는 CPU 아키텍쳐의 성능에 영향을 받는다.

명령어 처리 속도를 향상시키고 싶다면 위에서 봤던 DDR 메모리 기술의 clock cycle을 최적화 해야 한다.

 

 

 

 

CPU의 성능을 측정하기 위해서는 응답속도 Response time과 처리량 Throughput이 중요한데,

응답시간은 작업이 완료되는데 걸리는 시간을

처리량은 한 번에 몇 개의 작업을 실행할 수 있는지를 측정한다.

 

 

우리는 이 중 작업이 완료되는데 걸리는 시간인 response time에만 집중하여 공부할 것이다.

 

 

 

 

 

성능은 시간과 관련하여 정의한다. 실행 시간이 짧을수록 성능이 더 높다.

 

만약 두 개의 시스템이 있다고 가정할 때

PerformanceX / PerformanceY = Execution timeY / Execution timeX

이와 같은 등식으로 두 시스템의 성능 비율을 구할 수 있다.

이 등식은 시스템 X의 성능을 Y의 성능으로 나눈다면, 이는 곧 Y 시스템에서 작업을 완료하는 데 걸린 시간과 X 시스템에서 작업을 완료하는 데 걸린 시간의 비율과 같다는 것을 의미한다.

 

 

그래서 우리는 X가 Y보다 n배 더 빠르다는 것을 유추해낼 수 있다.

 

 

 

예시 문제

  • 예시:
    시스템 A와 B가 주어졌을 때, 동일한 프로그램을 실행하는 데 시스템 A는 7초, 시스템 B는 21초가 걸린다면, 시스템 A는 시스템 B보다 몇 배 더 빠른가?
    • 계산 과정:
      실행 시간 비율을 계산해보면, Execution timeB / Execution timeA = 21초 / 7초 = 3이다. 따라서, 시스템 A는 시스템 B보다 3배 더 빠르다.

 

 

 

 

그렇다면 여기에서 말하는 실행시간을 측정하는 방법에 대해 알아보자.

 

 

 

  • 경과 시간(Elapsed Time):
    시스템의 전체 응답 시간을 측정하며, 모든 요소를 포함한 전체 시스템 성능을 말한다.
    하지만 시스템 전체의 성능을 측정하는 데 영향을 미치는 외부 요인이 많기 때문에 비교 목적으로는 적절하지 않다.
    그래서 우리는 경과시간이 아닌 CPU 시간을 측정할 것이다.
  • CPU 시간:
    특정 작업을 처리하는 데 CPU가 실제로 사용한 시간을 의미
    • CPU 시간 = 사용자 CPU 시간 + 시스템 CPU 시간
      • 사용자 CPU 시간: 실제로 프로그램의 명령을 실행하는 데 소요된 시간.
      • 시스템 CPU 시간: 하드웨어 접근, I/O, 메모리 관리와 같은 운영 체제의 작업을 처리하는 데 사용된 시간.

 

우리는 여기에서 사용자 CPU 시간에 중점을 둘 것이다.

즉, 이는 주어진 프로그램 코드의 명령을 실행하는 데 걸리는 시간을 의미한다.
또한 Execution time 실행 시간은 사용자 CPU 시간으로 정의한다.
(다른 요인들(예: 시스템 전체의 성능)이 성능에 중요한 영향을 미칠 수 있기 때문)

 

 

 

 

 

 

CPU time을 계산하기 전에 알아야 하는 용어가 있다.

 

디지털 하드웨어의 동작은 일정한 속도의 "클록"에 의해 조절된다.
클록 신호는 CPU가 데이터를 처리하고 상태를 업데이트하는 시간 단위이다.

 

 

  • 클록 빈도수(Clock Frequency / Rate):
    초당 클록 사이클 수를 의미하며, 클록 빈도수는 CPU 속도의 중요한 지표이다.
    • 예: 4.0GHz = 4000MHz = 4.0 × 10^9Hz
  • 클록 주기(Clock Period):
    하나의 클록 사이클이 걸리는 시간을 말한다. 주기가 짧을수록 CPU는 더 많은 작업을 더 빠르게 처리할 수 있다.
    • 예: 250ps = 0.25ns = 250 × 10^-12s

 

클록 주기는 CPU가 작업을 처리하는 속도를 결정하는 중요한 요소로, 클록 빈도수가 높을수록 CPU는 더 많은 명령을 처리할 수 있다.

 

 

 

 

아까 말한 CPU time은 위에서 말한 Clock Rate와 Period로 구할 수 있다.

 

 

다시 정리하자면 Performance는 Execution time으로 결정되고, 이 실행시간은 user CPU time이다.

CPU time은 CPU의 clock cycles와 clock cycle time을 곱한것으로, clock cycle time은 clock rate(빈도수)의 역수로 나타낸다.

 

 

 

이를 바탕으로 추론하면 CPU의 성능을 개선하는 방법은 두 가지가 있다.

  1. 클록 사이클 수를 줄임.
  2. 클록 빈도수(clock rate)를 높임.

 

( clock rate를 높여서 CPU 성능을 향상시킬 수 있지만, 동시에 클록 사이클 수와 전력 소비 간에 trade-off가 존재할 수 있다.)

 

 

 

예시)

  • 문제 설명:
    • 컴퓨터 A의 클록 빈도수는 2GHz이고, CPU 시간은 10초입니다.
    • 컴퓨터 B는 CPU 시간을 6초로 줄이려는 목표가 있습니다.
    • 그러나 컴퓨터 B는 A보다 1.2배 많은 클록 사이클이 필요합니다.
  • 질문:
    컴퓨터 B가 6초 내에 작업을 완료하려면 Clock Rate가 얼마여야 하는가?

 

 

 

따라서 컴퓨터 B4GHz의 클록 주파수에서 실행되어야 목표로 하는 6초의 CPU 시간을 달성할 수 있다.

 

 

 

 

 

여기에서 Clock Cycles 는 CPI라는 개념을 통해 다시 정의할 수 있다.

따라서 Performance ( = Execution time = CPU Time) 는 다음과 같이 계산할 수 있다.

 

 

  • 명령어 개수(Instruction Count):
    프로그램이 실행할 명령어의 수는 프로그램, ISA(명령어 집합 구조), 그리고 컴파일러에 의해 결정된다.
  • CPI(Clock Cycles Per Instruction):
    CPI는 CPU 하드웨어에 의해 결정되며, 명령어를 처리하는 데 필요한 클록 사이클 수이다. 만약 서로 다른 명령어들이 다른 CPI를 가지면, 평균 CPI를 계산할 수 있다.

 

 

 

 

 

  • 예시 문제:
    • 컴퓨터 A사이클 시간250ps이고, CPI2.0입니다.
    • 컴퓨터 B사이클 시간500ps이고, CPI1.2입니다.
    질문:
    • 컴퓨터 A컴퓨터 B 중 어떤 컴퓨터가 더 빠른가?
    • 그 차이는 얼마나 되는가?

 

 

컴퓨터 A가 B보다 얼마나 빠른지 계산하기 위해, 두 시스템의 CPU 시간 비율을 구해보면 B / A = 1.2

즉, 컴퓨터 A는 컴퓨터 B보다 1.2배 더 빠르다.

 

 

 

 

이런 경우도 상정할 수 있다.

서로 다른 명령어가 있는데, 각 명령어별로 다른 CPI를 고려하여 전체 CPU 성능을 계산해야 할 수도 있다.
즉, 명령어마다 CPU에서 처리하는 데 필요한 clock cycle 수가 다르다는 의미이다.

그래서 여러 명령어들에 따라 가중 평균 CPI를 구하는 방법이 있다.

 

 

여러 명령어 클래스가 존재할 때, 전체 클록 사이클 수 계산 방법이다.

 

 

 

다음은 프로그램 전체의 평균 CPI를 가중 평균 공식으로 계산하는 방법이다.

각 명령어 클래스의 CPI 값에, 해당 클래스의 명령어가 프로그램 내에서 차지하는 비율을 곱하여 더한 값이 전체 프로그램의 평균 CPI가 된다.

 

 

 

 

  • 만약 클래스 A의 명령어가 프로그램의 40%, 클래스 B가 30%, 클래스 C가 30%를 차지한다면, 각 클래스의 CPI를 곱한 뒤 이 비율을 적용하여 평균 CPI를 계산할 수 있다.
  • 예를 들어, 클래스 A의 CPI가 1, 클래스 B의 CPI가 2, 클래스 C의 CPI가 3일 때:

따라서, 이 프로그램의 평균 CPI는 1.9

 

 

 

 

 

각 클래스 별 CPI가 각각 1, 2, 3으로 주어졌을 때

명령어 시퀀스가 다르게 분포되어 있다.

 

각 시퀀스에 대해 평균 CPI를 계산하기 위해서 각 클래스의 CPI에 명령어 개수를 곱한 후, 전체 명령어 개수로 나누자.

 

시퀀스 1의 평균 CPI

 

 

 

시퀀스 2의 평균 CPI

 

 

평균 CPI가 낮을수록 CPU는 더 적은 clock cycle로 명령어를 실행할 수 있기 때문에 성능이 더 올라간다.

이 결과를 통해 시퀀스 2는 평균적으로 더 적은 clock cycle을 사용하여 명령어를 처리하므로, 시퀀스 2가 1보다 성능이 더 좋다는 것을 알 수 있다.

 

 

 

 

 

우리는 CPU time (execution time)이 세 가지 요소에 의해 결정된다는 것을 배웠다.

 

 

이 요소들은 아래와 같이 표현할 수도 있다.

 

즉, CPU의 성능은 여러 요소들을 통해 종합적으로 결정된다.

알고리즘(명령어 개수), 프로그래밍 언어(명령어 효율성), 컴파일러, ISA, 하드웨어 등등...

 

 

 

이 외에도 CPU의 성능은 전력 소비와 큰 연관이 있다.

우리가 CPU를 설계할 때 CPU의 성능을 향상시키는 것과 동시에 전력 소비를 최소화 시키는 것이 중요하다.

 

 

보통 CPU의 전력 소비를 줄이기 위해서 전압과 클록 빈도를 낮춘다. 하지만 전압을 줄이는 데에는 한계가 있으며 이것을 전력 벽 Power Wall 이라고 한다.

이런 벽을 만나면 성능을 향상시키는 다른 방법을 찾아야 한다.

 

 

 

그래서 멀티코어 프로세서를 통한 병렬 프로그래밍이 필요하다.

즉, 프로그래머가 작업을 병렬로 처리할 수 있도록 코드를 작성해야 한다.

하지만 이 방법 역시 로드 밸런싱(각 프로세서에 작업 분배), 통신 및 동기화 최적화에서 난관을 겪는다.

 

 

 

 

 

이렇게 아무리 계속 최적화를 해도, 아무달의 법칙(Amdahl's Law)에 따라서

시스템의 한 부분을 개선한다고 해서 전체 성능이 항상 크게 향상되는 것은 아니다. 성능 향상의 한계가 있다.