출처 : http://www.designe.kr/?id=33&mode=essay
RDTSC(Read-Time Stamp Counter) :: 인텔사는 펜티엄부터 프로그래머들이 time-stamp counter를 쓸 수 있게 했다. time-stamp counter는 프로세서에 의존해서 사이클마다 카운트를 계산해낸다. 여기서 Intel time-stamp counter는 매 사이클마다 증가하는 64비트 MSR(model specific register)이고, 컴퓨터를 재부팅하면 time-stamp counter는 0으로 초기화된다.
이 카운터에 접근하기 위해서, 프로그래머들은 RDTSC 명령어를 사용할 수 있다. 이 명령어는 상위 32비트의 자료를 EDX 레지스터에 로드하고, 하위 32비트의 자료를 EAX에 로드한다.
time-stamp counter는 시간이 아닌 사이클을 측정한다는 것이 중요한데, 예를 들어, 200Mhz Processor는 실제 시간으로 1초에 2억번의 사이클을 돌고, 400Mhz Processor의 경우 실제로 0.5초에 2억번의 사이클을 돌게 된다. 결국 사이클 횟수를 비교하는 것은 오직 같은 속도의 프로세서들만 측정할 수 있다. 다른 속도를 가진 프로세서를 비교하기 위해서는 사이클 횟수를 시간으로 변경해야 한다.
아래는 사이클 횟수를 시간으로 변경할 수 있는 공식이다.
Where:
# seconds = # cycles / frequency
Note: frequency is given in Hz, where:1,000,000 Hz = 1Mhz
Function PROTOTYPE -----------------------------------------------------
unsigned __int64 snapshot_rdtsc() { static unsigned __int64 tick; static unsigned __int32 lo, hi; _asm _emit 0x0f _asm _emit 0x31 _asm mov lo, eax _asm mov hi, edx tick = hi; tick <<= 32; tick |= lo; return tick; }
그리고 다음의 소스는 제가 RDTCS를 이용하여 랜덤으로 함수를 생성해보았습니다.
RDTCS에서 뽑아낸 사이클을 srand() 함수의 seed로 이용하였습니다.
----------------------------------------------------- random
#include <iostream> #include <math.h> #include <windows.h> using namespace std; __declspec(naked) unsigned __int64 __cdecl rdtsc(void) { __asm { rdtsc ret ; return value at EDX:EAX } } void main() { unsigned int high; unsigned __int64 rdtscValue; rdtscValue = rdtsc(); high = (unsigned int)(rdtscValue & 0xFFFFFFFF); srand(high); for(int i=0; i<10; i++){ cout << (rand()%100)+1 << endl; } }
# 참고 사이트
http://www.geocities.com/krishnapg/RDTSC.html
http://pasta.east.isi.edu/algorithms/IntegerMath/Timers/rdtscpm1.pdf
'Robotics > Software Tech.' 카테고리의 다른 글
wiimote API & 데모 (0) | 2009.08.22 |
---|---|
음향에 의한 위치인식 (0) | 2009.06.20 |
Generic Image Array Library (0) | 2009.06.20 |
Sound Localization (0) | 2009.06.14 |
Visual studio 2008에서 응용프로그램 배포할 때 필요한 dll (2) | 2009.06.10 |