1. 성능이란?
성능(Performance)은 어떠한 물건이 지닌 성능과 기술로 컴퓨터에서 성능은 컴퓨터를 평가함에서 있어 가장 중요한 요소이며 우리가 시스템을 배우는 목적이기도 하다.(우리가 배우는 모든 지식들이 거이 성능을 올리기 위함이다.)
그러면 성능을 어떻게 특정해야 할까?
아래 그림을 보자
위 사진은 여객기의 종류의 각각의 여객기에 따른 수용인원, 순항범위, 순항 속도, 단위 시간당 수송할 수 있는 승객의 수를 보여준다.
이때 우리는 어느 여객기가 가장 좋은 성능을 가지고 있는지 기준에 따라 달라짐을 알 수 있다. (예를 들면 BAC/Sud Concorde가 속도가 가장 빠르지만, 가장 많은 승객을 실어나르는 여객기는 Airbus A380-800이다)
결국 성능을 평가함에 있어서 절대적인 기준을 정하기 어렵고 이는 컴퓨터에서 동일하다.
2. 컴퓨터에서의 성능
컴퓨터에서 성능을 비교할때, 일반적으로 프로그램에 대해서 비교하고 기준을 다음과 같이 정할 수 있다.
응답시간(response time): 주어진 일에 대해서 완료하기 까지의 시간 (실행시간(execution time))
처리량(throughput): 일정 시간동안 처리하는 일의 양(대역폭(bandwidth))
예를들어 동일한 프로그램에서 대해 A 컴퓨터가 B 컴퓨터보다 실행시간이 더 짧다면 응답시간 측면에서 A 컴퓨터가 성능이 더 좋다고 할수 있는 것이다.
여기서 주의해야하는것이다 응답시간의 경우 시간이기때문에 성능과 반비례관계를 가진다
$ Performance_x=\frac{1}{ Execution time_x}$
위 방법은 상당히 이론적으로 이상적인 측정법인데, 실제로 프로그램이 실행되는 환경이 단일 스레드 환경이 아니기 때문에 다른 쓰레드들과 context switch가 발생하고 I/O와 같이 block되는 경우 등등 다양한 상황이 존재하기 때문에 순수하게 프로그램이 진행되는 시간을 측정하는 것이 쉽지않다. 따라서 다음과 같은 용어가 파생되었다.
경과시간(elapsed time): 주어진 일을 완료하기까지 전체시간(I/O,overhead등등 모두 포함)
CPU 실행시간(CPU execution time): 주어진 일에 대해 CPU가 사용한 시간
그러나 이러한 overhead를 계산하는 것은 쉽지 않기 때문에 일반적으로 컴퓨터 구조에서 프로그램의 실행 시간을 측정함에 있어 CPU 실행시간을 사용한다.(그리고 이제부터 CPU TIME이라고 정의한다)
3. CPU TIME
CPU TIME은 어떻게 계산 할 수 있을까?
CPU TIME은 오직 프로그램을 실행하는데 있어 CPU가 소요한 시간이다.
이를 이해하기 위해서는 기계가 작동하는 원리에 대해 어느정도 알 필요가 있는데 클럭(Clock)이라는 마치 1초마다 움직이는 시계처럼 일정시간마다 전류를 공급받은 클럭을 기준으로 받은 전류통해 기계가 동작된다.
컴퓨터의 CPU도 동일한데 그러면 프로그램일 실행하는데 필요한 클럭주기수와 클럭당 시간을 곱하면 CPU TIME을 구할 수 있다.
예를 들어 우리가 알바로 상하차를 한다고 생각하면 상하차 알바를 끝내기 위해 5개의 트럭을 모두 보내야하고 하나의 트럭에 1시간씩 필요하다고 하면 총 5시간이 필요한 것과 같은 원리이다.
따라서 클럭 주기수는 곧 $CPU\ Clock \ Cycles $ 이고, 클럭당 시간은 $Clock\ Cycle\ Time$으로 표현할 수 있고, 식으로 표현하면 다음과 같다.
$ CPU \ TIME = CPU\ Clock \ Cycles * Clock\ Cycle\ Time$
$Clock\ Cycle\ Time$ 은 $Clock\ Rate$와 역수관계이므로,아래와 같이 표현 할 수 있다.
$ CPU \ TIME=\frac{CPU\ Clock \ Cycles}{ Clock \ Rate}$
위 식에 대해서 궁금증이 생길 수 있는데 Clock Cycle Time은 그렇다 쳐도 "CPU Clock Cycles을 어떻게 알 수 있을까?" 라고 생각 할 수 있다.
우리가 실행하고자 하는 프로그램은 결국 C Java 와 같은 code로 표현이 될텐데(사실 옳은 표현은instruction set architecture 가 맞다)이러한 명령어와 명령어 1개당 필요한 Clock Cycle 개수를 곱하면 CPU Clock Cycle과 동일하다.
따라서 CPI(Clock Per Instruction)이라는 새로운 개념을 도입하면 다음과 같이 표현할 수 있다.
$Clock\ Cycles=Instruction\ Count *Cycles\ per\ instruction $
이 식을 위식에 대입하면
$ CPU \ TIME = Instruction\ Count *CPI * Clock\ Cycle\ Time$
$ CPU \ TIME=\frac{Instruction\ Count \ * \ CPI }{ Clock \ Rate}$
예제 1)
Cycle time | CPI | |
computer A | 250ps | 2.0 |
computer B | 500ps | 1.2 |
두 컴퓨터가 같은 ISA(Instruction Set Architecture)을 가지는 경우 성능 비교를 해라:
Computer A에서 Instruction Count를 $I$라고한다면 같은 ISA을 가지기 때문에 Computer B도 insturction Count 를 $I$이다.
따라서 각각의 Clock Cycle을 표현하면 다음과 같다
$Clock\ Cycle_A= 2.0*I=2I$
$Clock\ Cycle_B= 1.2*I=1.2I$
각각의 CPU TIME을 구하면
$CPU_TIME_A=2I*250ps=500I\ ps$
$CPU_TIME_A=1.2I*500ps=600I\ ps$
따라서
$\frac{Performance_A }{Performance_B} =\frac{CPU\ TIME_B }{CPU\ TIME_A}= \frac{600I\ ps }{500I\ ps}=1.2$
A가 B보다 1.2 배 빠르다.
이때까지 우리가 봤던 CPU TIME은 모든 instruction이 동일한 CPI를 가지기때문에 곱하기만 하면 Clock Cycle을 구할 수 있었는데 Instuction 마다 다른 CPI를 가지는 경우가 존재한다.
예를 들어
A형식 instrucion의 CPI | B형식 instrucion의 CPI | C형식 instrucion의 CPI | |
CPI | 1 | 2 | 3 |
위처럼 서로다른 CPI가 주어지고
A형식 instuction count | B형식 instuction count | C형식 instuction count | |
1 | 2 | 1 | 2 |
2 | 4 | 1 | 1 |
서로다른 instruction count가 주어지고 평균 CPI를 구한다면
$Average\ CPI=\frac{Clock\ cycle}{Instruction\ count$ 이므로
이때 $Clock cycle= \sum_{i=1}^{n}(CPI_i *Instuction\ Count_i )$
이므로
$Clock\ cycle_1=(2*1)+(1*2)+(2*3)=10$
$Clock\ cycle_2=(4*1)+(1*2)+(1*3)=9$
$CPI_1=\frac{Clock\ cycle_1}{Instruction\ Count-1}=\frac{10}{5}=2.0$
$CPI_2=\frac{Clock\ cycle_2}{Instruction\ Count-2}=\frac{9}{6}=1.5$
으로 2가 1보다 빠르다.
결국우리가 시간을 측정함에 있어 단순히 명령어의개수(IC) 만을 고려해야하는 것이 아니라 클럭 개수(Clock cycle), 클럭 시간(Clock time)을 알아야 전체 소요 시간을 구할 수 있다.
게다가 이 3가지 요소는 서로서로 trade-off 관계를 가지기 때문에 어느 하나의 요소를 낮출경우 다른 두가지 요소가 증가 할 수 있어 단순히 낮추면 된다는 이분법적으로 생각하지 않도록 하자.
출처: 컴퓨터 구조 및 설계 6판
'CS > 컴퓨터구조' 카테고리의 다른 글
2. MIPS ISA(Instruction Set Architecture) (0) | 2023.07.31 |
---|