QueryPerformanceCounter가 나오기 전에는

 

x86 P5 명령 셋 도입 이후 높은 정밀도의 시간을 얻기 위해서 RDTSC(Read Time Stamp Counter)를 사용하였습니다. 그러나 RDTSC는 아래와 같은 문제가 있었습니다.

 

1. 연속성 없는 값. 멀티 코어, 멀티 프로세스에서는 코어간의 사이클 카운터가 동기화 되지 않습니다.

2. 전용 하드웨어의 가능성. RDTSC가 나온 이후 시간이 지나면서 마더보드에서 높은 정밀도의 시간 정보를 제공하는 디바이스를 제공하고 있습니다.

3. CPU 주파수의 변동성. 전원관리기술에 의해서 CPU 주파수가 변동됩니다.

 

위와 같은 문제를 안고 있는 RDTSC를 대체하기 위해 Win API에서는 QueryPerformanceCounter를 제공합니다.

 

 

 

그런데 QueryPerformanceCounter는 멀티 코어, 멀티 CPU에서 문제가 없을까요?

 

아니요 있습니다. RDTSC 1번 문제처럼 이것도 연속성 없는 값문제를 해결하지 못하고 있습니다. QueryPerformanceCounter를 문제 없이 사용하기 위해서는 이것을 하나의 스레드에서 사용하고 이 스레드를 하나의 프로세서에 고정시켜야 합니다.

 

원래 이 API 자체가 이런 멀티 코어, 멀티 CPU를 생각하지 않고 나온 것이 아닙니다. 오히려 이런 문제를 해결하는 것이 목적 중의 하나입니다. 그런데 왜 특정 프로세서에 고정시켜서 사용해야 할까요? 이유는 두 가지가 있습니다.

 

1. 하드웨어 버그

이것은 마이크로 소프트의 문제가 아니고 하드웨어 업체의 문제입니다. BIOS나 드라이버에 버그가 있으면 스레드가 프로세서 간 이동할 때 이들 루틴에서 서로 다른 값을 넘기는 경우가 있어서 이런 하드웨어 버그를 피하기 위해서 특정 프로세서에 고정시키는 것이(SetThreadAffinityMask 사용) 좋습니다.  

 

2. 병목

각 워커 스레드에서 시간 계산을 하면 각 스레드로부터 동기화 하기 위해 락을 걸어야 하므로 이것에 의한 병목이 발생합니다. 이것을 막기 위해서 하나의 스레드에서 시간 계산을 하도록 하여 락을 사용하지 않도록 합니다.

 

 

 

그럼 QueryPerformanceCounter를 하나의 스레드에서만 사용하고 이 스레드를 특정 프로세서에 고정시키는 것으로 문제는 없을까요?

 

아닙니다. 문제(?)는 여전히 있습니다. 이 문제는 근래에 생긴 문제로 원인 제공은 인텔입니다. 바로 인텔의 네할렘 계열 CPU가 문제가 됩니다. 네할렘 계열 CPU로는 i3, i5, i7이 있는데 이들 CPU터보 부스터기능이 있습니다. 이 기능은 각 코어의 주파수는 2.6인데 특정 코어가 부하가 걸리고 나머지 코어가 여유가 있으면 부하가 걸린 코어의 주파수를 올려줍니다(즉 2.6이 2.8이 되어버립니다).

 

주파수를 올려준다이 말에서 문제를 아시겠죠? OS에서는 시스템이 시작할 때 CPU의 주파수를 설정한 후 이후 다시 시스템을 재 시작 하기 전까지는 변경하지 않습니다. 그리고 QueryPerformanceCounter OS가 설정한 CPU 주파수를 사용합니다. 그런데 터보 부스터기능에 의해서 실제 주파수는 변경되어 버립니다. 그래서 터보 부스터가 작동하면 QueryPerformanceCounter의 값은 작동하기 전과 다른 값이 나와버립니다.

 

그래서 성능 측정에서 QueryPerformanceCounter을 사용할 때는 터보 부스터기능을 off로 해 놓아야 합니다. 그리고 게임과 같은 애플리케이션에서 사용할 때는 터보 부스터에 의해서 오차가 생길 수 있음을 유의해야 합니다.

 

 

 

터보 부스터QueryPerformanceCounter 문제 해결 방법은?

 

이건 저도 모릅니다.^^;

다만 Windows 7에서는 이런 문제가 없다고 합니다. 이유는 Windows 7는 이전 OS와 다르게 QueryPerformanceCounter에 다른 레퍼런스 클럭을 사용하고 있기 때문에 CPU 주파수가 변동 되어도 영향을 받지 않는다고 합니다. 참고로 이런 이유로 Windows 7QueryPerformanceCounter의 부하가 XP 보다 조금 높다고 합니다.

 

 

 

 

참고

http://msdn.microsoft.com/ja-jp/library/bb173458%28VS.85%29.aspx

http://d.hatena.ne.jp/shiku_otomiya/20100218/p1

http://d.hatena.ne.jp/shiku_otomiya/20100504/p1

 

저작자 표시
신고
by 흥배 2010.06.07 08:30
| 1 |