2007
04
13
22
59
如何在 multi-core CPU 下測量 performance.
最近,有個 Function 會 performance drop,
可是,分析出來的結果非常詭異。
說是在一個 loop 的多加 2 個 checking,
就會 performance drop。
所以,我想要自己來分析一下問題的真正原因。
就用以下的程式來得到performance的數據。
LARGE_INTEGER frequency={1000};
LARGE_INTEGER startPerformanceCount;
LARGE_INTEGER endPerformanceCount;
QueryPerformanceFrequency(&frequency);
QueryPerformanceCounter(&startPerformanceCount);
some_function();
QueryPerformanceCounter(&endPerformanceCount);
printf("%I64d * 10^-16 secsn", ((endPerformanceCount.QuadPart - startPerformanceCount.QuadPart) * 1000000 / frequency.QuadPart));
在測試 performance 時,
因為自己的 notebook 是 due core 的 CPU,
測出來的數據常常會飄移,沒辦法穩定下來。
猜測的原因是因為兩顆 CPU 的 loading 不太一樣,
如果是移到 loading 較輕的 CPU 執行的話,就會比較快,
相反的,loading 較重的,則是比較慢。
所以要想辦法把軟體執行在某一顆 CPU 上,
這樣跑出來的結果會比較穩定。
所以,用Google查了一下,
用下列的程式碼來解決這個問題。
HANDLE hThread =GetCurrentThread();
if (SetThreadAffinityMask(hThread ,1)==0) {
printf("SetThreadAffinityMask Errorn");
}
PS: 後來發現是因為我跑RmClock(降溫程式),
它似乎會造成兩個CPU的Clock Counting不一致,
所以,才會出現這種問題。
2007/7/6 Update:
關於QueryPerformanceCounter的一些問題.
http://msdn.microsoft.com/library/en-us/directx9_c/Game_Timing_and_Multicore_Processors.asp