본문 바로가기

정리/IT공부

속도 측정 원리에 대해

728x90

<속도 측정의 원리에 앞서...>

 

프로그래밍 작업을 하면서 속도 성능에 관심이 가던 중 이참에 아예 속도에 관해 정리를 하고자 이 포스팅을 준비했습니다. 아주 근본적인 부분부터 차근차근 찾아서 정리해봤습니다. 어떤 대상을 측정하기 위해선 기본적으로 기준점이 필요합니다. 예를 들어 사람이 달리는 속도를 측정할 때는 처음시간이라는 기준점을 이용하고 달리기 시작 위치를 기준점으로 잡죠. 마찬가지로 컴퓨터도 프로그램의 속도를 측정하기 위해선 두 가지 기준점이 필요하리라 생각할 수 있습니다. 프로그램의 처리량(?) 그리고 시간이죠. 얼마나 짧은 시간에 얼마나 많은 양의 데이터를 처리했는가 하는 것처럼 두 가지 기준이 필요하죠. 그도 그럴게 속도라는게 그런거죠.ㅎㅎㅎ 

 한편 컴퓨터에는 성능을 측정하기에 좋은 하드웨어 도구가 있습니다. 바로 CPU 입니다. 아주 작은 단위 시간의 동작으로 많은 양의 데이터를 처리하죠. 특히, 전력 공급만 일정하다면 그 처리량이 규칙적일 것 같지 않나요? 그러면 이 cpu로 어떻게 컴퓨터의 속도, 프로그램의 속도를 측정하는지 알아보고 싶지만.... 그보다 먼저 시간의 정의를 찾아봤습니다.

 

더보기

(秒, 기호 s)는 시간의 단위로, 국제단위계의 기본단위 중 하나이다. 절대 영도에서 세슘-133 원자의 바닥 상태 (6S1/2) 에 있는 두 개의 초미세 에너지준위 (F=4, F=3)의 주파수 차이를 9,192,631,770 Hz로 정의하고 그 역수를 통해 초를 정의하고 있다.[1] 즉, 세슘 133이라는 원자에 어떤 특정 주파수의 전파를 쬐면 세슘 원자가 바닥상태에서 들뜬 상태로 변하게 되는데 이 특정 전파의 진동수를 세고 그 진동수가 9,192,631,770가 되면 1초로 하는 것이다. 

<위키>

 

 

1초를 측정하기 위해선 어떤 측정 기준 도구의 진동수가 관건이군요. 그리고 세슘 133의 진동수를 측정 할 때 91억번 정도가 되는 동안 제가 2번 눈을 깜빡인다면 저는 1초에 2번 눈을 깜빡이는게 되겠네요. 근데 진동수를 센다는게 이상합니다.  진동수를 찾아봐야겠네요.

 

 

다음은 진동수(주파수)의 정의 입니다.

 

 

더보기

진동수(振動數, frequency)는 주기적인 현상이 단위시간 동안 몇 번 일어났는지를 뜻하는 말으로, 주파수(周波數)라고도 한다. SI단위로는 헤르츠(Hz)를 쓴다. 1 Hz는 1초에 1번 주기적인 현상이 일어나는 것이고, 2 Hz는 1초에 2번 주기적인 현상이 일어나는 것이다. 헤르츠 외 다른 단위로는, rpm(revolutions per minute), rad/s(radians per second), BPM(beats per minute)등이 있다.

< 파동의 주파수 > 소리, 전자기파, 전기신호 등의 주파수를 측정할 때, 헤르츠는 같은 모양의 파동이 1초에 몇번 반복되는지를 나타낸다. 소리의 경우에는 음의 높이를 주파수라고 할 수 있다. 주파수는 파장과 역수의 관계가 있다. 주파수

f

는 파동의 진행속도 

v

를 파장 

\lambda

로 나눈 것이다.

f = \frac{v}{\lambda}

<위키>

 

 

단위 시간 동안 주기적인 현상이 몇 번 일어났는지 뜻하는 말인데 헷갈립니다. 위의 초의 정의와 진동수의 정의를 보면 이상하게 돌고 도네요. 둘 중 하나는 문제가 있어보입니다.  여러 다른 문서를 본 끝에 "세슘133이 91억번 진동하는 기간을 1초로 정의"했다는 사실을 확인했습니다. 저 첫번째 박스의 빨간 부분은 우리가 흔히 말하는 frequency인 '진동수'를 측정하는게 아니라 진동 횟수를 확인한 것입니다. 즉, 움직임의 횟수죠. 그리고 왜 하필 세슘 133이냐하면 미세 전이의 주기성이 굉장히 규칙적이기 때문이라고 합니다. cpu의 처리 능력이 굉장히 규칙적일 것으로 기대하는 부분과 대응됩니다. 따라서 규칙적인 CPU를 가지고 속도를 비교해보기에 적절하다고 볼 수 있겠네요.

 

 

CPU의 처리 능력이 무엇인지 궁금해지네요. 그리고 그것을 대부분 Hz로 설명합니다. 아래는 Hz에 대한 wiki 설명입니다. 

 

더보기

In computers, most central processing units (CPU) are labeled in terms of their clock rate expressed in megahertz or gigahertz (106 or 109 hertz, respectively). This number refers to the frequency of the CPU's master clock signal ("clock rate"). This signal is a square wave, which is an electrical voltage that switches between low and high values at regular intervals.

<참고>

cpu의 처리 능력을 Hz로만 평가할 수는 없습니다. cpu architecture와 feature에 따라서 그 처리 능력이 달라집니다. 하지만 여기선 hz에 대한 부분만 집중적으로 찾아봤습니다.

 

 

'CPU의 처리 능력'을 'low와 high의 값으로 변하는 전위차인 square ware (구형파)의 진동수'로 설명 할 수 있다고 합니다. (electrical voltage = electrical potential difference = 전위차 , 구형파 =각진 파 (矩 [모날 구,법도 구])) 어찌됐든 CPU는 이러한 전위차를 일정하게 공급받기 위해 하나의 장치가 필요합니다. 바로 Clock 입니다. 이 클럭에 의해 일정한 형태의 전력을 일정하게 받을 수 있게 되고 이 clock 이 1초에 구평파 하나를 내놓는다면 마찬가지로 1Hz가 됩니다.

음? Clock 도 1Hz  CPU도 1Hz...  

 

"클럭 generator의 기능 : clock generator which produces the system clock signal to synchronize the various components" ... mother board @wiki

 

 

Clock은 clock generator를 말하는데 대게 메인보드에 있다고 합니다. (집적된 칩의 경우 하나로 패키지되어 있을 수 있습니다.)

그리고 CPU가 최적의 성능 발휘하는 정규 속도를 내기 위해선 이에 맞게 Clock generator가 전압차를 줘야한다고 합니다!

즉, CPU의 최적의 성능을 내기 위해선 Clock의 능력도 중요하다는 사실!

2015년 나온 intel의 i7 제품은 4GHz(40억 Hz) 라고 하는데 이 성능을 보장받기 위해선 Clock 또한 4GHz의 성능을 제공해 줄 수 있어야하는 겁니다.

 

한편 Clock의 성능은 자유자재로 변경이 가능한편입니다. 오버클럭이라는 말이 있는게 이 때문이죠. 즉 CPU는 Clock이 제공해주는 전력에 맞춰 동작을 합니다. 다른 컴포넌트들도 마찬가지죠. CPU의 '최고'의 성능을 위해선 오버클럭을 해주면 되고 '최적'의 성능을 위해선 CPU제조사가 권장하는 클럭을 주면 되는 거겠죠. (오버클럭할땐 전원도 좋은걸 써야겠네요.)

 

 

 

정리를 하겠습니다.

 

"현실 세계에서 1초를 측정하기 위해선 세슘 133의 진동 횟수를 측정한다. 왜냐하면 세슘의 움직임이 규칙적이기 때문이다."

 

그리고

 

"CPU는 적절한 환경에서 '현실 세계의 1초'를 기준으로 동작하는 횟수가 최대한 규칙적이도록 만들어졌다."

 

그러면 컴퓨터 세계에서 1초는 어떻게 측정이 되는가? 바로 이런 특징을 가지고 있는 CPU를 이용하여 시간을 측정하는게 맞겠죠? (세부적인 설명은 다음에 추가하려합니다.)

 

코딩을 하면서 어떤 알고리즘의 속도를 측정하기 위해선 결국엔 이런 Clock과 관련된 값들을 이용해야 겠네요. 그러나 그것들을 직접적으로 이용하는데는 무리가 있을 것 같습니다. 왜냐하면 그 사이에는 OS가 자리하고 있기 때문입니다. 따라서 우리가 제작한 프로그램의 속도를 측정하기 위해선 OS에서 제공해주는 Interface를 이용해서 프로그램의 속도를 측정해야겠습니다.

 

 

 

아래는 linux에서의 측정의 예입니다.

 

TEST_COUNT 는 100만번입니다.

 

 

time.h 헤더 파일은 clock의 동작을 확인 할 수 있는 함수(clock())를 가지고 있습니다.

 

 

function 1 : for 문을 이용.

function 2 : do while 문 이용

function 3 : while 문이용

 

동일한 코드로 생각하고 작성을 합니다.

 

아래는 속도를 측정한 결과입니다.

 

 

 

코딩에 따라 그 속도는 이처럼 차이가 납니다. 지속적으로 진행했을 때 그 평균값을 봐도 차이가 날 것으로 추측할 수 있습니다.

이 말을 다시 해석하면 저 세 개의 함수가 같아보이지만 실제로 CPU는 다르게 동작한다는 것이겠죠. (자세한 비교는 my lab에서...)

여기까지 컴퓨터 속도 측정 원리 정리였습니다. (CPU와 Clock 에 대한 정리는 추후에 더하겠습니다.)