봉황대 in CS

[Chapter 1. 컴퓨터 추상화 및 관련 기술] 컴퓨터의 성능과 CPU Time 본문

Computer Science & Engineering/Computer Architecture

[Chapter 1. 컴퓨터 추상화 및 관련 기술] 컴퓨터의 성능과 CPU Time

등 긁는 봉황대 2022. 8. 13. 17:54

* 본 글은 '컴퓨터 구조 및 설계: 하드웨어/소프트웨어 인터페이스(Computer Organization and Design: The Hardware/Software Interface) 5th edition'의 내용과 2021학년도 1학기에 수강한 '컴퓨터 구조' 과목 강의 내용을 함께 정리하여 작성하였습니다.

 

 

4 종류의 여객기가 존재한다.

각각의 탑승 인원, 비행거리와 속도는 아래와 같다고 해보자.

 

 

여기서 가장 성능이 좋은 여객기는 무엇일까?

수송 능력 면에서는 Airbus가 가장 좋고, 비행거리 면에서는 DC-8, 속도 면에서는 Concorde가 가장 좋다.

 

하지만 속도 관점에서 성능을 정의한다고 하면, 두 가지 정의가 있을 수 있다.

1. 최고 항속의 비행기

2. 승객 처리량이 가장 빠른 비행기

 

 

 

이처럼 컴퓨터의 성능도 여러 가지 방법으로 정의할 수 있다.

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

 

1. 두 데스크톱 컴퓨터에서 같은 프로그램을 실행시키는 경우, 먼저 끝나는 쪽이 더 빠른 컴퓨터라고 할 수 있다.

2. 여러 대의 서버를 가지고 여러 사용자의 작업을 처리하는 데이터센터에서는

    하루 동안 더 많은 작업을 처리하는 컴퓨터가 더 빠른 컴퓨터일 것이다.

 

우리는 성능을 비교하기 위해서는 먼저 성능을 정의해야 한다!

 

 

성능 (Performance)


성능의 기준으로는 여러 가지가 존재하는데,

컴퓨터의 가장 중요한 2가지 성능 평가 지표는 응답 시간과 처리량이다.

 

1. 응답 시간 (response time)

컴퓨터가 작업 개시에서 완료하기까지의 총 소요 시간을 말한다.

즉, 디스크 접근, 메모리 접근, 입출력 작업, 운영체제 오버헤드 및 CPU 시간을 전부 포함한다.

 

2. 처리량 (throughput) / 대역폭 (bandwidth)

단위 시간 동안 처리하는 작업의 양을 말한다.

 

 

현재로서는 컴퓨터의 성능을 논할 때 응답 시간에 초점을 맞출 것이다.

 

성능을 최대화하기 위해서는 어떤 작업(태스크)의 응답 시간 또는 실행시간을 최소화해야 한다.

(성능과 실행시간은 반비례 관계)

 

따라서 어떤 컴퓨터 X의 성능과 실행시간의 관계는 다음과 같이 표시할 수 있다.

 

 

상대 성능 (Relative Performance)

두 컴퓨터 X와 Y에 대하여 X의 성능이 Y의 성능보다 좋다면 우리는 "X가 Y보다 n배 빠르다"라고 말한다.

이때 n은 다음과 같이 정의할 수 있다.

 

 

 

(예시)

같은 프로그램을 실행하는데 컴퓨터 A에서 10초 B에서 15초 걸렸다면,

A는 B보다 15/10 = 1.5배 빠르다.

 

성능의 측정 (Measuring Execution Time)

컴퓨터 성능의 가장 기본적인 척도는 시간이다.

 

같은 작업을 최단 시간에 실행하는 컴퓨터가 가장 빠른 컴퓨터이며,

프로그램 실행시간은 프로그램을 처리하는 데 걸린 시간을 초 단위로 표시한 것이다.

 

그러나 시간은 우리가 재는 방법에 따라 여러 가지로 정의될 수 있다.

 

 

1. 벽시계 시간 (Wall-clock Time)

위에서 말한 응답 시간과 같다. (한 작업을 끝내는 데 필요한 전체 시간 = 경과 시간)

디스크 접근, 메모리 접근, 입출력 작업, 운영체제 오버헤드 및 CPU 시간을 전부 다 포함한다.

 

 

2. CPU 실행시간 (CPU Execution Time)

단순히 CPU 시간(CPU Time)이라고 부른다.

 

프로세서가 순수하게 이 프로그램을 실행하기 위해 소비한 시간을 말한다.

(응답 시간에서 디스크 접근, 메모리 접근, 입출력 작업 시간을 제외한 것)

 

(1) 사용자 CPU 시간 : 프로그램 자체에 소비된 CPU 시간

(2) 시스템 CPU 시간 : 프로그램 수행을 위해서 운영체제가 소비한 CPU 시간

 

* 사용자 CPU 시간과 시스템 CPU 시간을 정확히 구하는 것은 쉽지 않다.

운영체제의 각 작업이 어떤 프로그램을 위해서 수행되고 있는가를 명확히 가려내는 것이 어렵고

운영체제 간의 기능 차이도 있기 때문이다.

 

CPU 관점에서의 성능 측정

컴퓨터의 세세한 부분을 평가할 때는 다른 성능 척도를 사용하는 것이 편리할 때가 있다.

 

컴퓨터의 설계자는 하드웨어가 기본 함수를 얼마나 빨리 처리할 수 있는지와 관련된 성능 척도를 필요로 한다.

거의 모든 컴퓨터는 하드웨어 이벤트가 발생하는 시점을 결정하는 클럭(clock)을 이용하여 만들어진다.

 

우리는 이 클럭의 시간 간격을 클럭 사이클(clock cycle)이라고 한다.

 

 

한 클럭 사이클에 걸리는 시간은 두 가지로 표현할 수 있다.

1. 클럭 주기 (Clock Period, Clock Cycle Time) : 한 클럭 사이클에 걸리는 시간

2. 클럭 속도 (Clock Frequency, Clock Rate) : 1초에 도는 사이클의 개수 (클럭 주기의 역수)

 

 

 

 

(예시 문제)

클럭 주기가 250ps라고 했을 때 클럭 속도는 얼마일까?

ps(picoseconds)는 10^-12 seconds이므로, 1/250 * 10^-12 = 10^12 / 250 = 4 * 10^9

따라서 클럭 속도는 4.0 GHZ이다.

 

 

* 단위와 기호

10^3 : k (kilo) 10^-3 : m (milli)
10^6 : M (mega) 10^-6 : µ (micro)
10^9 : G (giga) 10^-9 : n (nano)
10^12 : T (tera) 10^-12 : p (pico)
10^15 : P (peta)  

 

CPU Time


CPU 시간은 클럭 사이클과 클럭 주기를 통해 나타낼 수 있다.

 

CPU Time은 어떤 일을 하는데 걸리는 클럭 사이클의 총시간이며,

클럭 사이클의 총시간은 프로그램의 클럭 사이클 총 수 × 클럭 주기이다.

 

 

위의 식을 통해 성능을 개선하는 방법 2가지를 도출할 수 있다.

1. 클럭 사이클의 길이를 줄인다.

2. 클럭 사이클의 수를 줄인다.

 

 

(예시 문제)

 

명령어 성능

프로그램을 실행할 때 컴파일러가 실행할 명령어를 생성하고, 컴퓨터는 이 명령어를 실행해야 하기 때문에

CPU Time을 명령어의 수와 관련해서도 나타낼 수 있어야 한다.

 

프로그램 실행에 필요한 CPU 클럭 사이클 수(Clock Cycles)는

령어 수 × 명령어 당 평균 클럭 사이클 수(Average CPI)이다.

 

 


명령어 당 클럭 사이클 수(Clock Cycles per Instruction)는 줄여서 CPI라고 부른다.

 

하나의 명령어 처리 시에는 여러 개의 Clock Cycle이 필요로 하고 그 수는 명령어마다 다르다.

 

이에 명령어 각각의 실행시간이 다르기 때문에,

프로그램이 실행한 모든 명령어의 Clock Cycles에 대해 평균한 값을 척도로 사용해야 한다.

 

 

명령어의 종류마다 'CPI × 명령어의 수'를 더한 것이 Clock Cycles이 되며,

 

CPI는 Cycles per Instruction이므로 'Clock Cycle / Instruction Count'이다.

이를 위의 식에 대입하면 다음과 같이 CPI를 나타낼 수 있다.

 

 


본론으로 되돌아오면,

위의 Clock Cycles 식을 통해 아래처럼 CPU Time 공식을 확장할 수 있게 된다.

 

 

 

* 같은 프로그램이라고 해서 명령어의 수는 모두 동일할까?

 

아니다.

컴파일러와 ISA가 달라지면 기계어도 달라지게 되어 명령어의 수는 달라지게 된다.

동일한 ISA 위에서는 프로그램에 필요한 명령어 수가 같다.

 

따라서 ISA 구조가 같은 경우에만 CPI는 서로 다른 구현을 비교하는 한 가지 기준이 될 수 있다.

 

 

(예시 문제)

 


아래는 위에서 언급한 CPI에 대한 공식이며, 붉은색 부분을 주의 깊게 보자.

 

 

해당 부분의 분모는 명령어의 총개수를 말하는 것이기 때문에

명령어 i에 대한 빈도수(relative frequency)를 나타내는 것과 같다.

 

따라서 우리는 명령어의 실질적인 개수가 아닌, 빈도수만 알고 있어도 CPI를 구할 수 있는 것이다.

(CPI = Clock Cycles × Frequency)

 

 

 

(예시 문제)

 

위의 예시를 통해 명령어의 수가 많아진다고 해서 무조건 느려지는 것은 아님을 볼 수 있다.

 


위의 내용들을 총 정리하자면 다음과 같다.

 

 

컴퓨터 성능에 대한 완벽하고 믿을 만한 척도는 실행시간밖에 없다는 것을 잊지 말아야 한다.

 

명령어 개수를 줄이기 위해 명령어 집합을 바꾸었을 때

클럭 속도가 느려지거나 CPI가 커져서 오히려 성능이 더 나빠질 수도 있다.

 

또한 CPI는 실행되는 명령어 종류에 따라 달라지므로

실행 명령어 수가 적은 코드가 항상 가장 빠른 것은 아니다.

 

 

반응형
Comments