minkylee

[컴퓨터구조] 시스템의 성능 본문

CSE/컴퓨터구조

[컴퓨터구조] 시스템의 성능

minkylee 2024. 4. 5. 13:13

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

두 데스크탑 컴퓨터에서 같은 프로그램을 실행시키는 경우에는 먼저 끝나는 쪽이 더 빠른 컴퓨터라고 할 수 있다. (응답시간) 그러나 여러 대의 서버를 가지고 여러 사용자의 작업을 처리하는 데이터센터를 운영할 때에는 하루동안 더 많은 작업을 처리하는 컴퓨터가 더 빠른 컴퓨터일 것이다. (처리량)

  • 응답시간 : 컴퓨터가 테스크를 완료하기까지의 총 소요 시간, 디스크 접근, 메모리 접근, 입출력 작업, 운영체제 오버헤드 및 CPU 시간을 다 포함한다.
  • 처리량 : 단위 시간당 완료하는 테스크의 수를 나타내는 또 다른 성능 척도

성능을 최대화하기 위해서는 어떤 테스트의 응답시간 또는 실행시간을 최소화 해야한다. 어떤 컴퓨터 X의 성능과 실행시간의 관계를 다음과 같이 표시할 수 있다.

$$ 성능_x = \frac{1}{실행시간_x} $$

그러므로 두 컴퓨터 X와 Y에 대해 X의 성능이 Y의 성능보다 좋다면

$$ 성능_x > 성능_y $$
$$ \frac{1}{실행시간_x} > \frac{1}{실행시간_y} $$
$$ 실행시간_y > 실행시간_x $$

가 된다. 즉, X가 Y보다 빠르다면 Y에서의 실행시간이 X에서의 실행시간보다 길다.

  • 정량적인 표현 : X가 Y보다 n배 빠르다.

$$ \frac{성능_x}{성능_y} = n $$

X가 Y보다 n 배 빠르다면 Y에서의 실행시간이 n배 길 것이다.

$$ \frac{성능_y}{성능_x} = \frac{실행시간_y}{실행시간_x} $$

성능의 측정

  • 프로그램 실행시간 : 프로그램을 처리하는 데 걸린 시간을 초 단위로 표시한 것 (응답시간, 경과 시간)

컴퓨터를 공유하는 경우, 프로세서 하나가 여러 프로그램을 동시에 실행하는 경우가 많이 있다. 이런 환경에서는 특정 프로그램의 경과시간을 최소화하는 것보다는 처리량을 최적화하는 것이 중요할 수 있다. 그러므로 경과시간과 구분해서 프로세서가 순수하게 이 프로그램을 실행하기 위해 소비한 시간을 계산할 필요가 있다. 이를 CPU 실행시간 (CPU execution time), CPU 시간 (CPU time) 이라고 한다.

입출력에 걸린 시간이나 다른 프로그램을 실행하는 데 걸린 시간은 포함하지 않는다. CPU time은 사용자 CPU 시간 (user CPU time)시스템 CPU 시간 (system CPU time) 으로 다시 나눌 수 있다.

  • 사용자 CPU 시간 : 프로그램 자체에 소비된 CPU 시간
  • 시스템 CPU 시간 : 프로그램의 수행을 위해서 운영체제가 소비한 CPU 시간

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

경과 시간을 기준으로 한 성능과 CPU 시간을 기준으로 한 성능을 구분하는 것이 좋다.

  • 시스템 성능 : 다른 부하가 없는 시스템에서의 경과 시간으로 계산한 것
  • CPU 성능 : 사용자 CPU 시간으로 계산한 것

컴퓨터의 세세한 부분을 평가할 때는 다른 성능 척도를 사용하는 것이 편리할 때가 있다. 특히 컴퓨터 설계자는 하드웨어가 기본 함수를 얼마나 빨리 처리할 수 있는지와 관련된 성능 척도를 필요로 한다. 거의 모든 컴퓨터는 하드웨어 이벤트가 발생하는 시점을 결정하는 클럭을 이용하여 만들어진다.

  • 클럭 사이클 : 일정한 속도를 가지고 동작하는 프로세서 클럭 한 주기 동안의 시간
  • 클럭 주기 : 한 클럭 사이클에 걸리는 시간 (예를 들면 250ps)
  • 클럭 속도 : (예를 들면 4GHz) 클럭 속도는 클럭 주기의 역수이다.

CPU 성능과 성능 인자

컴퓨터의 성능을 표시하는 데 사용자가 사용하는 척도와 설계자가 사용하는 척도가 서로 다른 경우가 많이 있다. 이 때 서로 다른 척도간의 상관관계를 구할 수 있다면, 설계상의 변화가 사용자에 느끼는 성능에 얼마나 영향을 미치는 지 평가할 수 있다. 당분간은 CPU 서응에만 관심을 갖기로 했으므로 궁극적인 성능 척도는 CPU 시간이다.

$$ 프로그램의 CPU 실행시간 (CPU time) = 프로그램의 CPU 클럭 사이클 수 X 클럭 사이클 시간 $$
클럭 속도와 클럭 사이클 시간은 역수 관계이므로
$$ 프로그램의 CPU 실행시간 = \frac{프로그램의 CPU 클럭 사이클 수}{클럭 속도} $$

-> 이 공식을 통해 클럭 사이클의 길이를 줄이거나 프로그램 실행에 필요한 클럭 사이클 수를 줄이면 성능을 개선할 수 있음을 알 수 있다.
But, 이 둘 중 하나를 감소시키면 다른 하나가 증가하는 경우가 자주 발생한다. 예를 들어 클럭 사이클 수를 줄이는 기법 중에는 클럭 사이클 시간을 증가시키는 것들이 많이 있다.

명령어 성능

컴파일러가 실행할 명령어를 생성하고 컴퓨터는 이 명령어를 실행해야 하기 때문에, 실행시간은 프로그램의 명령어 수와 관련이 있다.

$$ CPU 클럭 사이클 수 = 명령어 수 X 명령어당 평균 클럭 사이클 수 $$

  • 명령어당 클럭 사이클 수 (clock cycles per instruction) 은 CPI로 줄여 쓰기도 한다.

명령어마다 실행시간이 다르므로 CPI는 프로그램이 실행한 모든 명령어에 대해 평균한 값을 사용한다. 명령어 집합 구조가 같으면 프로그램에 필요한 명령어 수가 같으므로, CPI는 서로 다른 구현을 비교하는 한 가지 기준이 될 수 있다.

고전적인 CPU 성능식

성능식을 명령어 개수(프로그램이 실행한 명령어의 개수), CPI, 클럭 사이클 시간으로 표현하면
$$ CPU 시간 = 명령어 개수 X CPI X 클럭 사이클 시간 $$
클럭 속도는 클럭 사이클 시간의 역수이므로
$$ CPU 시간 = \frac{명령어 개수 X CPI}{클럭속도} $$

컴퓨터 성능에 대한 완벽하고 믿을 만한 척도는 실행시간밖에 없음을 잊지 말자. 명령어 개수를 줄이기 위해 명령어 집합을 바꾸었을 때 클럭 속도가 느려지거나 CPI가 커져서 오히려 성능이 더 나빠질 수도 있다. 마찬가지로 CPI는 실행되는 명령어 종류에 따라 달라지므로 실행 명령어 수가 적은 코드가 항상 가장 빠른 것은 아니다.

성능식의 세 가지 인자 값은 어떻게 구할까? CPU 실행시간은 실제 프로그램을 실행시켜서 얻을 수 있고, 클럭 사이클 시간은 보통 컴퓨터의 하드웨어 메뉴얼에 기록되어 있다. 그러나 명령어 개수와 CPI는 구하기가 조금 어렵다. 클럭 속도와 CPU 실행시간을 알 때, 명령어 개수나 CPI 중 하나를 알면 다른 하나는 계산으로 구할 수 있다.

명령어 개수는 실행 과정을 추적하는 소프트웨어 도구나 컴퓨터 구조의 시뮬레이터를 이용해서 측정할 수 있다. 그 외에 하드웨어 카운터를 사용하면 실행 명령어 수나 평균 CPI, 심지어는 성능 저하의 원인까지 찾아낼 수 있다.

  • 성능에 영향을 미치는 여러가지
    • 어떤 알고리즘을 사용하는가? -> IC, CPI 에 영향을 미친다.
    • 어떤 언어를 사용하는가? -> IC, CPI에 영향을 미친다.
    • 어떤 컴파일러를 사용하는가? -> IC, CPI에 영향을 미친다.
    • 어떤 instruction을 수행하게 되는가 -> IC, CPI, Clock Cycle time에 영향을 미친다.