[0909] 컴퓨터의 요소, CPU Time을 구하는 방법
[목차]
1. 컴퓨터의 요소
2. 추상화
3. 성능을 좌우하는 요소들 비교하기
4. CPU의 성능
5. CPU의 Clock
6. CPU Time을 구하는 방법
1. 컴퓨터의 요소
1) 같은 요소들
- 데스크탑, 서버, 임베디드 등
2) Input 과 Output을 포함하는 것
- 사용자 인터페이스 기기의 디스플레이, 키보드, 마우스 등
3) 네트워크 어뎁터
- 다른 컴퓨터와 통신하기 위한 것
컴퓨터의 요소를 그림으로 표현하자면,
네모난 공장이 있고, 그 안에 있는 레일과 나오는 레일이 존재한다.
그리고 그 안에 종이, 명령이 적힌 종이를 들고 있는 사람이 있다.
이러한 그림으로 보자면, 들어가는 레일은 Input 나오는 레일은 Output이고
명령이 적힌 종이를 들고 있는 것은 controll이라고 하며, 이것은 일이 선택적으로 일어나는 배경을 뜻한다. 그리고 이 종이에 써져있는 것이 바로 '지시' 그 어떤 동작을 처리할지 소프트웨어가 하드웨어에게 알려주는 인스트럭션이다.
컨트롤 다음에는 데이터 경로라는 것이 존재하는데, 이것의 본질은 지나면서 처리가 일어나는 현상을 말한다. 전에 내린 지시를 통해서 일으키는 처리와 동작이 일어나는 것이다.
또 다른 예시로, 사용자에게 화면을 보여주는 LCD 스크린의 경우를 생각해보자. 그림의 요소는 픽셀들이다.
이것은 그냥 보여지는 것이 아닌, 이진수들로 입체적으로 이뤄져있어, 이것들이 합쳐져서 원하는 색을 표한하게 된다.
이 내용은 참고용으로만 알고 있으면 될 것 같다.
컴퓨터의 내부를 열어보면,
비슷할까 의문이 든다. 예시를 들어 스마트폰이나 테블릿도 일반 데스크탑 컴퓨터와 구조가 같을까?
분해한 결과 기본 구조들은 비슷하지만 같지는 않다. 완전히 구조상 똑같을 수가 없다.
그러나, 프로그램 실행 방식은 동일하다. 이러한 측면에서 컴퓨터 구조를 잘 이해하면 응용할 수 있다는 것을 알 수 있다.
2. 추상화
추상화는 우리가 복잡한 것을 이해하기 쉽도록 도와준다. 예를 들어, 컴퓨터의 소프트웨어와 하드웨어의 계층 구조를 그린 그림만 봐도 그것은 추상적으로 이해하기 쉽게 표현된 그림이라는 것을 알 수 있다.
- instruction set architeature{ISA):
이것은 그냥 소위 말해 아키텍쳐라는 뜻이다. 하드웨어와 소프트웨어의 인터페이스.
즉 h/w s/w의 계층 구조가 있을 때 하드웨어와 운영체제 사이를 이어주는 것이 아키텍쳐이다. 앞에 인스트럭션 셋이라고 붙이는 이유는 보통, 아키텍쳐라는 말을 했을 때 건축을 떠올리기 때문에 확실히 컴퓨터스러운 느낌으로 구별해서 쓰기 위해 이렇게 명명했다고 한다.
- Application binary interface(ABI):
ISA와 시스템 소프트웨어 인터페이스가 합해진 것이다. 이부분에 대해서 자세한 기억이 없다.
이부분에 대해서 더 알아봐야겠다. 필기가 되어있는 것으로 보아, 아마 응용 프로그램과 비슷하게 설명이 되지 않았나 싶다. ... 찾아본 결과 ABI란, 응용 프로그램과 운영체제, 응용 프로그램과 라이브러리 사이에 필요한 저수준의 인터페이스를 의미한다. ABI는 API보다 저수준이다.
- Implemention(Microarchitecture):
더 낮은 수준에서 보는 인터페이스라는데, 이것에 대해서도 정확히 모르겠다.
찾아본 결과, 마이크로 아키텍쳐라는 용어는 마이크로 프로그램의 언어들이 통제하는 장치를 일컫는데 쓰인다고 한다. 또한, 개념은 일반적으로 모든 CPU들 곧 단일 칩 멀티 프로세서나 다중칩 프로세서들은 다음과 같은 단계를 수행하며 프로그램들을 실행한다고 한다.
1. 함수를 읽어서, 읽은 함수를 디코딩한다.
2. 함수를 처리해야 하는 연결 데이터를 찾는다.
3. 함수를 처리한다.
4. 결과 출력을 기록한다.
3. 성능을 좌우하는 요소들 비교하기
여기 예를 든 그래프가 있다. 비행기의 성능을 나타낼 수 있는 지표들을 나타낸 것인데 예를 들어 더 많은 승객을 태울 수 있는 비행기가 다른 지표들과 비교해봤을 때 더 느린 속력을 가지고 있다. 단편적으로 어떠한 지표만으로 성능을 결정할 수 없다는 것을 보여준다. 맨 오른쪽 아래의 그래프는 각각의 지표들의 곱이다. 많은 승객수를 태울 수 있지만 느린 속도를 가진 비행기가 성능이 좋다는 것을 알 수 있는 그래프이다. 이에 대해서 CPU도 마찬가지이다.
- 응답 속도(response time):
일을 처리하는 속도가 얼마나 걸리는지에 대한 속도이다.
- 처리율(Throughput):
모든 일을 다 마쳤을 때 걸리는 시간의 퍼센트를 뜻한다. 예를들어 일/트랜스액션/...걸린 시간을 말한다.
응답 시간을 효과적으로 만들 수 있는 방법은 무엇이 있을까?
1. 프로세스를 빠른 프로세스로 교체할 경우:
프로세스 자체를 빠른 것으로 바꾸게 되면, 응답 시간은 줄어들어 이전과 비교했을 때보다 훨씬 빨라지게 되고, 처리율은 증가하게 된다. (물론, CPU가 속도에 절대적으로 연관되어있는 요소는 아님을 명심하자)
하지만..
2. 프로세스를 기존의 것에 하나 더 추가할 경우:
우선, 하나의 일을 두개의 프로세서가 나누는 것은 어렵다. 하나 단위로 프로세서 하나가 하나의 일을 처리할 뿐이다. 그러므로 동시에 여러가지 일을 할 때처럼 처리율은 좋아지지만, 그것의 개수가 늘어났을 뿐 프로세서 하나의 응답 시간은 차이가 없다. 달라지지 않는다. 하나하나 일처리를 끝내는시간은 똑같기 때문이다.
Performance 관계>>
- Performance의 정의: 1/실행타임(execution time)
- X가 Y보다 n 시간 더 빠르다! 라고 할때, (그럼 X의 시간이 더 적게 걸린 것)
Px/Py = Y의 실행타임/X의 실행타임 = n이 된다. 서로 역수 관계임을 알 수 있다.
예를 들어본다면, A는 10s가 걸렸고, B는 15s의 시간이 걸렸다.
그럼 B가 시간이 더 많이 걸렸으므로 식은 아래와 같다. 적게 걸린 요소를 앞에다 두고 생각해야 하므로,(왜지?)
PerformanceA/PerformanceB이므로, 이것의 역수를 취하면
Exceution TimeB/ Excecution TimeA 의 식이 나오게 되고, 이를 연산하면
15/10 = 1.5가 된다. 그래서 성능은 5초가 더 빠르다, 라고 표현하는 것이 아니라 1.5배 더 성능이 좋다라고 정확히 표현해야 하는 것이다.
4. CPU의 성능
CPU의 성능을 측정하기에는 많은 요소들이 영향을 받게 된다.
- 경과 시간:
총 응답 시간은 모든 측면을 포함한 것이다. 이 모든 측면이라고 하면, 순수한 CPU의 계산 성능을 포함하여 다른 요소들이 응답을 처리하는 시간까지 포함한 것이다. 에를 들어, 입출력 프로세싱과 운영체제에 의한 처리들을 실행하는 모든 시간까지 합쳐진 것이다. 순수한 CPU의 계산 성능을 보려면 이것을 배제하고 보아야 하며, 교재에서는 CPU Time이라고 하면 이러한 요소들을 배제하고 생각한 것이라고 했다.
- CPU Time:
아까 말했듯이, CPU Time이란 위에 언급했던 바와 같다. 또한 순수한 성능을 측정하기 어려운 이유중 하나가 총 응답시간에 다른 일을 같이 공유하고 있느 간섭에 의하여 응답시간이 느려지고 그에 따라 성능이 저하되기 때문의 이유도 있다. 실제는 이러한 영향이 CPU Time에 영향을 미치는 것이다, 그 정도만 알아둬도 된다.
5. CPU의 Colcoking
클럭이란, 시간의 기준점으로 시간을 일치시키는 목적으로 쓰이는 것이다. 클럭의 주기는 clock의 한 사이클, 상승 엣지와 하강엣지 한 세트를 말하게 되며, 클럭의 비율은 초당 cycle의 수를 말한다.
예를 들어, 클럭 주기는 250ps(피코 세컨드) 일때, 이것은 0.25ns(나노 세컨드)와 같다.
250ps = 0.25ns = 250 곱하기 10의 -12제곱 s이다.
* 여기서 피코 세컨드는 시간의 단위로, 1피코 세컨드는 10의 -12제곱 초이다.
또한 클럭 비율(초당 사이클의 개수)는 4.0GHz이면 = 4000MHz = 4.0 곱하기 10의 9제곱 Hz가 된다.
여기서 또 알아야 할 점은, 이 둘 그러니까 클럭의 주기와 비율은 역수 관계라는 것이다. 단위만 딱 봐도, 10의 마이너스 12 제곱과 10의 9제곱... 역수로 보이기는 한다. 아직 단위에 대한 개념은 조금 헷갈리는 것 같다. 이 부분에 대해서 내일 조금 더 공부해봐야겠다.
6. CPU Time을 구하는 방법
앞서 말했던 CPU Time을 구하려면 공식 상으로는, 아래와 같은 공식이 필요하다.
CPU Time = CPU Colock Cycles * Clock Cycle Time( 사이클 클럭 수와 사이클 타임)
이 식을 CPU Clock Cycles/Clock Rate 로 표현할 수도 있다.
하지만 공식이 중요한것이 아니라, 이해를 해야한다.
예를 들어, CPU가 1GHz의 속도로 10개의 instruction을 수행하는데, 한 인스트럭션당 15cycle을 돈다고 한다. 그럼 이때 이 인스트럭션을 다 수행하는데에는 10개의 인스트럭션을 15사이클을 돌아야 하므로 총 150개의 사이클을 돌아야 한다는 것을 알 수 있다.
그럼 CPU 타임은 사이클을 도는 수 곱하기 사이클 타임이므로, 사이클을 도는 수는 150, 사이클 타임은 1GHz이므로 150ns가 CPU 타임이 된다. 이렇게 이해하면 공식이 훨씬 쉬워진다.
그런데 여기서 의문을 가진다. 왜 시간을 처리할 때 1GHz를 1/1G로 역수를 취해서 계산하는걸까? 이유를 모르겠다.
이 부분에 대해서도 의문을 가지고 내일 해결해보려고 한다.
계속해서 내용을 정리해보자면, 다음은 CPU Time을 향상 시키려면 어떻게 해야할까?에 관한 내용이다.
향상시키려면, 우선 생각에 공식을 보고 생각해보자면
1. Cycle이나 CycleTime을 줄인다.
2. Clock Rate를 늘이면 될 것 같다.
왜냐하면 식을 보자면 cycle의 개수와 Time은 서로 곱해지는 수이므로 이 시간을 줄이려면 자연스럽게 이 수들이 줄어들어야 할 것 이다. 그러나 반대로 Clock Rate가 있는 식을 보면 이것은 분모이므로 숫자가 더 커야지 자연스럽게 전체적인 수 시간이 줄어들게 될것이다. 그러나, 여기서 문제가 있다. 줄인다고 무조건 해결을 할 수 없다.
이 변수들은 각각 독립적인 것들이 아닌 종속변수라는 문제가 있다.
간단히 말해서, 하나의 요소만을 수를 줄인다고 그대로 줄어드는 것이 아니라 다른 요소가 해당 요소가 줄어든 만큼 늘어나게 되는 현상을 가지고 있어서 속도를 조절하는데 있어서 어려움이 있다는 소리가 된다.
이러한 경우를 절충관계라고도 한다.
이렇게 사진으로만 보면 참 어려워보이는 공식이다. 사실 처음 봤을때는 이게 뭔가, 싶었지만 나중에 차근히 설명을 들어보니 그런 경우였구나!를 깨닫게 되었다. 설명하자면,
제일 위의 공식은 아까 다뤘던 내용과 같다. 하지만, 저것은 기본적인 하나의 Cycle을 구할 때 쓰는 내용이고. 인스트럭션이 하나만 있는 것은 절대 아니므로, 여기서 문제가 발생한다. 여러개의 인스트럭션이 있다면 계산을 어떻게 해야하나?
그렇다면 답은 간단하다. 여러개의 인스트럭션을 그 종류별로 계산하여 그 합을 모두 더하는 방법이다.
가령 A 인스트럭션의 사이클은 10s이다. B 인스트럭션 사이클은 15s이다. 이 인스트럭션이 각각 3개씩 있다고 할 경우, A는 3*10 B는 3*15이므로 이 계산결과는 30과 45이고 이것을 총 합을 구하면 75가 되어 각각의 인스트럭션의 총 Clock Cycle을 구할 수 있는 것이다. 그래서 두번째 공식이 다소 복잡해보이더라도, 이러한 내용의 공식이 되는 것이다.
그러나 또, 저러한 위의 공식은 인스트럭션의 케이스가 여러개가 존재할 경우 사용하는 공식이다.
만약, 운 좋게 인스트럭션의 개수가 같고 그 인스트럭션의 사이클이 같다면? 아래와 같은 유도 방식으로 나온 것들로 인해 간단하게 공식이 추려지게 된다.
사실, 인스트럭션이 무수히 많아서 같을 경우의 우연의 일치의 확률은 거의 존재하지 않는다. 그러나, 이것을 사용할 경우가 있다. 바로 평균을 내서 사용하는 경우에는 이 공식이 유용하게 쓰인다.
위의 표는 성능 비교를 해보는 예시이다.
우선, A와 B C 세개의 인스트럭션이 존재한다. class는 클럭 사이클/인스트럭션 마다 걸리는 시간이다. 그러니 크면 클수록 인스트럭션 자체가 무겁다는 말이 된다.
여기서 정말, 정말 간단하게 생각을 해보자.
인스트럭션의 개수만 봤을때는 첫번째는 5개, 두번째는 6개로 첫번째의 경우가 더 성능이 좋아보인다. 그러나, 개수만으로는 확정할 수 없다.
이번에는 클럭 사이클을 구해보자.
첫번째의 경우 1*2 + 2*1 + 3*2 = 10이고, 두번째의 경우 4*1 + 2*1 + 3*1이므로 9가 된다. 이렇게 사이클로 따졌을 때에는 두번째가 성능이 더 좋아보인다. 하나의 지표만을 봤을때보다 이 지표를 이용해서 보았을 때가 맞는 지표이므로 두번째가 성능이 더 좋다고 할 수 있다.
다음으로 CPI의 평균을 구해보자.
첫번째에는, 아까 사이클의 총 합이 10이었고, 인스트럭션의 개수가 5였으므로 사이클 합/인스트럭션개수를 하여 평균은 2가 나온다. 두번째에는 합이 9이고 인슷트럭션의 개수가 6이었으므로 나누면 평균은 1.5가 되는 모습을 볼 수 있다.
아직도 뭔가 용어가 헷갈려서 마지막으로 용어를 정리하고 끝낸다.
CPI(Cycle per Instruction):
명령어 당 평균 소요 사이클(사이클/개)를 뜻하고,
IPC(instructions per cycle):
한 사이클 당 완료 가능 명령어 개수를 뜻한다. 둘은 역수관계이다.
어제의 질문에 관한 답 2019-09-10 수정:
1. 성능 비교를 할 때 왜 적은 시간을 앞에다가 쓰는가?
적은 시간을 앞에다 쓰는 공식에 집착을 굳이 하기 보다는 상식선에서 생각하자.
cpu의 성능을 비교하기 위해서는 몇 배 차이가 난다, 라는 말로 표현해야 한다. 그렇다면, 몇 배 차이가 나는지 구하려면 작은 수가 분모로 계산해야지 몇 배인지 실수로 나오게 된다.
예를 들어 A는 10s B는 15s가 걸린다고 할 때, A는 B보다 1.5배 빠르다는 것을 증명하려면 15/10을 해야지(분모가 작은 것의 값을 선택 해야지 이 값이 나오게 된다.
2. 왜 1GHz의 단위를 이용하여 계산하려면 역수를 취해야 하는가?
앞선 예시를 다시 정리해보겠다.
1GHz는 우선 모든 명령이 처리될 때까지 걸리는 시간을 말한다. 여기서 문제를 출발해보자면,
10개의 인스트럭션이 있고, 이 인스트럭션은 하나당 15사이클을 가진다. 이것을 실행하는 데에 걸리는 시간은 1GHz이다. 그리고나서 CPU Time을 구하기 위해서는 아래와 같은 식을 써야한다.
CPU Time = 사이클 클럭의 개수 * 사이클 타임
그렇다면 사이클 클럭의 개수는 10개의 인스트럭션이 있고, 한개당 15 사이클을 도므로 총 150개의 사이클을 구할 수 있다. 그리고 나서 사이클 타임을 구해야하는데.. 사이클 타임은 말 그대로 시간, 시간이다.
그러나 GHz 단위는 시간당 단위이므로, 그냥 시간을 구하려면 역수를 취해야 한다.
단위의 의미 측면에서 접근해보면
1Hz는 1s-1제곱이고, 이것은 1초에 한 번을 의미한다. 즉 100Hz는 1초에 100번이다. 이것을 보면 1Ghz는 10의9제곱Hz가 되는데, 이것은 1초에 10의9제곱번을 의미한다. '번'이라는 단위, 초라는 단위가 주가 아니므로, 시간을 구하기 위해서는 역수를 취해야 한다. 그렇다면 시간은 = 1/10의제곱 이 되는 것이다.
이러한 의미로 역수를 취해서 계산하게 되는 것이다.
3. instruction Count?
말 그대로 인스트럭션의 개수였다. 그리고 CPI는 명령어당 평균 소요 사이클을 말하는 것이므로,
여러가지 인스트럭션이 존재하고, 그 인스트럭션당 사이클 개수가 모두 다르므로 각각의 인스트럭션 별로 구해서 총 합을 구해야 한다.
이에 따라서 공식은,
CPI = 인스트럭션의 개수 * 인스트럭션을 수행할 때 걸리는 시간 의 총합이 되는 것이다.
'Undergraduate Records' 카테고리의 다른 글
[0911] 객체지향설계, Programming이란? (0) | 2019.09.12 |
---|---|
[0910] 시스템 프로그래밍 복습 (0) | 2019.09.11 |
bomb lab: phase_2 (0) | 2019.08.21 |
bomb lab: phase_1 문제 풀이 (0) | 2019.08.21 |
GitHub 개념 사용서 - 기본편 (0) | 2019.08.20 |