본문 바로가기
CS/컴퓨터 구조

[Chapter 1.2 컴퓨터 구조 및 설계] 컴퓨터의 성능과 CPU Time

by 베어 그릴스 2022. 7. 5.
본 정리는 CS422-컴퓨터 구조 및 설계 : 하드웨어/소프트웨어 인터페이스. David A. Patterson,존 헤네시 책을 바탕으로 하고 있음을 미리 알립니다.

 

성능


어떤 컴퓨터가 다른 컴퓨터보다 성능이 좋다는 것은 무엇을 뜻하는 것일까?

속도가 빠르다? 안전성이 높다? 데이터를 많이 전송할 수 있다? 등등 매우 다양하다.

즉, 우리가 성능을 정의하기 위해선 성능이 무엇인지부터 정의해야 한다.

 

위 그림은 비행기의 예시인데, 잘 보고 생각해보면 가장 빠른 비행기는 Bac/Sud Concorde일지는 몰라도 가장 많은 승객을 수송할 수 있는 것은 Airbus A380-800 일 것이다.

 

이제 여러 관점에서 성능을 정의해보면

  1. 응답 시간(response time) : 작업 개시에서 종료까지의 시간 즉, 태스크를 완료하기까지의 총 소요시간으로 디스크 접근 메모리 접근, 입출력 작업, CPU 시간을 다 포함한다. 실행 시간(execution time)이라고도 한다.
  2. 처리량(throughput) : 일정 시간 동안 처리하는 작업의 양, 대역폭(bandwidth)라고도 한다.

즉, 응답 시간이 중요한 개인 휴대용 기기와 처리량이 더 중요한 서버의 성능을 평가할 때는 다른 성능 척도를 사용해야 한다.

 

상대 성능


X가 Y보다 N배 빠르다 할 때, 이 N을 구하는 방법은

X의 성능 / Y의 성능을 구하면 되는데, 성능과 실행 시간은 반비례한다.(실행시간이 짧아야 성능이 좋다.)

 

즉, 공식은

이 된다.

 

예를 들어, 같은 프로그램을 실행하는데 컴퓨터 A에서 10초 B에서 15초 걸렸다면, A는 B보다 15/10 = 1.5배 빠르다는 것을 알 수 있다.

 

성능의 측정


시간은 컴퓨터 성능의 가장 기본적인 척도이다. 이 시간도 우리가 재는 방법에 따라 여러 가지로 정의할 수 있다.

  1. 벽시계 시간(Wall clock Time): 위에서 말한 응답 시간과 같다. 다시 한번 정의하자면 작업 개시에서 종료까지의 시간 즉, 태스크를 완료하기까지의 총 소요시간으로 디스크 접근 메모리 접근, 입출력 작업, CPU 시간을 다 포함하는 시간이다.
  2. CPU 시간(CPU Time) : 위 벽시계 시간과 구분해서 프로세서가 순수하게 이 프로그램을 실행하기 위해 소비한 시간.(응답 시간에서 디스크 접근 메모리 접근, 입출력 작업 시간 등을 뺀 시간) 
    1. 사용자 CPU 시간 : 프로그램 자체에 소비된 CPU 시간.
    2. 시스템 CPU 시간 : 프로그램 수행을 위해서 운영체제가 소비한 CPU 시간

참고 : 사용자 CPU 시간과 시스템 CPU 시간은 운영체제의 각 작업이 어떤 프로그램을 위해서 수행되고 있는가를 명확히 가려내는 것이 어렵고 운영체제 간의 기능 차이도 있기 때문에 정확히 구하는 것이 쉽지 않다.

 

CPU 관점에서 성능의 측정


컴퓨터의 설계자는 하드웨어가 기본 함수를 얼마나 빨리 퍼리 할 수 있는지와 관련된 성능 척도를 필요로 한다. 거의 모든 컴퓨터는 하드웨어 이벤트가 발행하는 시점을 결정하는 클럭을 이용하여 만들어진다.

이 클럭의 간격을 클럭 사이클 (Clock cycle)이라 한다.

이때 한 사이클에 걸리는 시간을 두 가지로 표현한다.

  1. 클럭 주기 (Clock period 혹은 Clock Cycle Time) : 한 사이클에 걸리는 시간
  2. 클럭 속도 (Clock Frequency 혹은 Clock Rate) : 1초에 몇 사이클이 도는지. 즉, 클럭 주기의 역수이다.

클럭 주기 250ps를 클럭 속도로 나타내면 ps는 10^-12 second이므로 1/250*10^-12 = 10^12/250 = 4*10^9이므로 4.0 GHZ가 된다

 

참고  

1000 K  1/1000 m 3제곱
1000000 M  1/1000000 u 6제곱
1000000000 G  1/1000000000 nano 9제곱
1000000000000 T  1/1000000000000 piko 12제곱
1000000000000000 P    15제곱

 

이제 우리는 CPU Time을 클럭 사이클과 클럭 주기를 통해서 나타낼 수 있다.

 

CPU Time은 어떤 일을 하는데 걸리는 클럭 사이클의 총시간으로 나타낼 수 있는데,

클럭 사이클의 총시간은 프로그램의 클럭 사이클 총 수 * 클럭 주기로 나타낼 수 있기 때문이다.

CPU Time을 구하는 공식

즉, 우리는  클럭 사이클의 길이를 줄이거나 클럭 사이클 수를 줄이면 성능을 개선할 수 있다.

 

예시 문제 )

같은 프로그램을 실행한다고 우선 가정해보자.

A 컴퓨터가 2 GHz의 Clock Rate를 갖고 있고, 이 프로그램을 실행할 때, 10 CPU Time이 소요된다고 하자.

B 컴퓨터를 설계하는데, 6초의 CPU Time이 걸리게 하고 싶다고 할 때, Clock Rate를 얼마든지 빠르게 만들 수 있는데, A 컴퓨터에서보다 1.2배만큼 Clock Cycle이 증가한다고 할 때 B의 Clock Rate는 몇으로 해야 할까?

 

답↓ 

더보기

위 식에 의하여, A의 Clock Cycles는

 

10 second = A의 Clock Cycles/2*10^9*cycles/second(속도)

A의 Clock Cycles = 20 *10^9 cycles

 

즉 이제 B를 구해보면,

 

1.2*20*10^9 cycles/B의 ClockRate = 6 second

B의 ClockRate = 4*10^9 cycles/second 가 된다.

즉, 4 GHz가 된다.

 

명령어 성능


그렇다면 위에서 정의한 Clock Cycles 수를 어떻게 알 수 있을까? 

프로그램을 실행할 때 컴파일러가 실행할 명령어를 생성하고 컴퓨터는 이 명령어를 실행해야 하기 때문에 결국 Clock Cycle은 명령어의 수로 관련하여 나타낼 수 있다.

명령어마다 걸리는 Cycle 수가 다르므로,

 

Clock Cycles 수 = 명령어 수 * Average CPI (Cycles per Instruction 즉, 명령어 마다 걸리는 Cycle 수의 평균)

으로 나타낼 수 있다.

 

 

CPU Time 공식의 확장

 

같은 프로그램이라고 해서 명령어의 수가 모두 동일한가?

대답은 '아니오.'이다. 

 

1-1에서 설명한 바와 같이 컴파일러와 ISA가 달라지면 기계어도 달라지기 때문에 달라지게 된다는 점을 유의해야 한다.

 

예시 문제 )

Computer A: Cycle Time = 250ps, CPI = 2.0

Computer B: Cycle Time = 500ps, CPI = 1.2

동일한 ISA와 컴파일러를 갖고 있다고 할 때 무엇이 얼마나 더 빠른가?

 

답↓ 

더보기

동일한 ISA와 컴파일러를 갖고 있으므로 명령어의 수가 동일하다.

명령어의 수를 I라고 하면,

A CPU Time =  I*2.0(명령어당 걸리는 Cycle) *250ps(한 사이클마다 몇 초가 걸리는지) = 500*I ps

B CPU Time =  I*1.2(명령어당 걸리는 Cycle) *500ps(한 사이클마다 몇초가 걸리는지) = 600*I ps

 

즉, A가 1.2배 더 빠르다.

 

위에선 평균 CPI로 구했는데, 더 구체적으로 들어가면

명령어마다 CPI가 다르고 각 명령어의 수가 다르기 때문

CPI*명령어 수를 명령어의 종류마다 해주어서 더해주어야 그것이 Clock Cycles가 된다.

구체화된 Clock Cycles

CPI는 Cycles per Instruction 이므로, Clock Cycle / Instruction count로 나타낼 수 있다.

이때 위에서 구한 Clock Cycle 공식을 대입하면 다음과 같이 CPI를 나타낼 수 있다.

CPI를 구하는 공식

즉, 이제 우리는 명령어의 실질적인 개수가 아니라 빈도수만 알고 있어도 그것에 각 CPI를 곱해서 더하여 CPI를 구할 수 있다.

빈도수만 알아도 Cycle과 곱해서 CPI를 알 수 있게 된다.

 

예시 문제 )

CPI for instruction classes A, B, C

다른 컴파일러에 의해 1과 2 코드로 실행 명령어의 개수가 다음과 같아졌다.

1. 어떤 코드가 더 많은 명령어를 실행하는가?

2. 어느 것이 더 빠른가?

3. 각 코드의 CPI는 얼마인가?

 

답↓ 

더보기

1. 명령어의 수는 1번이 5개 2번이 6개로 2번이 더 많다.

 

2.

1번의 클럭 사이클은 (2*1) + (1*2) + (2*3) = 10

2번의 클럭 사이클은 (4*1) + (1*2) + (1*3) = 9

이므로 1번이 더 빠르다

 

3. 

CPI 1 = 10/5

CPI 2 = 9/6

 

즉 명령어의 수가 많아진다고 무조건 느려지는 것은 아니다 라는 것을 알 수 있다

 

요점 정리


결국 중요한 것은 컴퓨터 성능에 대한 완벽하고 믿을 만한 척도는 실행시간 밖에 없다는 것이다.

명령어의 개수를 줄이기 위해 명령어 집합을 바꾸었을 때 클럭 속도가 느려지거나 CPI가 커져서 성능이 나빠질 수도 있다.

 

 

틀린 사항이나 질문 있으면 댓글로 남겨주세요!👌