CPU に関する情報を読み取り、ユーザーに表示する C# ソフトウェアを作成しようとしています (CPU-Z と同様)。私の現在の問題は、CPU 周波数を表示する方法を見つけられなかったことです。
最初はWin32_Processor クラスを使った簡単な方法を試しました。CPU がオーバークロック (またはアンダークロック) されている場合を除いて、非常に効率的であることが証明されました。
次に、レジストリの HKLM\HARDWARE\DESCRIPTION\System\CentralProcessor\0に CPU の「標準」クロックが含まれていることを発見しました (オーバークロックされている場合でも)。問題は、最新の CPU では、CPU がフルパワーを必要としないときにコア乗数が減少するため、CPU 周波数も変化しますが、レジストリの値は同じままです。
私の次のステップは、RdTSCを使用して実際に CPU 周波数を計算することでした。メソッドが機能している場合は C# プロジェクトに埋め込むことができるため、これには C++ を使用しました。http://www.codeproject.com/Articles/7340/Get-the-Processor-Speed-in-two-simple-waysで次のコードを見つけました が、問題は同じでした: プログラムは最大周波数しか提供しません。 (レジストリ値のように、1〜2 Mhzの違い)、CPUに必要以上に負荷をかけているようにも見えます(CPU負荷のスパイクさえありました)。
#include "stdafx.h"
#include <windows.h>
#include <cstdlib>
#include "intrin.h"
#include <WinError.h>
#include <winnt.h>
float ProcSpeedCalc() {
#define RdTSC __asm _emit 0x0f __asm _emit 0x31
// variables for the clock-cycles:
__int64 cyclesStart = 0, cyclesStop = 0;
// variables for the High-Res Preformance Counter:
unsigned __int64 nCtr = 0, nFreq = 0, nCtrStop = 0;
// retrieve performance-counter frequency per second:
if(!QueryPerformanceFrequency((LARGE_INTEGER *) &nFreq))
return 0;
// retrieve the current value of the performance counter:
QueryPerformanceCounter((LARGE_INTEGER *) &nCtrStop);
// add the frequency to the counter-value:
nCtrStop += nFreq;
_asm
{// retrieve the clock-cycles for the start value:
RdTSC
mov DWORD PTR cyclesStart, eax
mov DWORD PTR [cyclesStart + 4], edx
}
do{
// retrieve the value of the performance counter
// until 1 sec has gone by:
QueryPerformanceCounter((LARGE_INTEGER *) &nCtr);
}while (nCtr < nCtrStop);
_asm
{// retrieve again the clock-cycles after 1 sec. has gone by:
RdTSC
mov DWORD PTR cyclesStop, eax
mov DWORD PTR [cyclesStop + 4], edx
}
// stop-start is speed in Hz divided by 1,000,000 is speed in MHz
return ((float)cyclesStop-(float)cyclesStart) / 1000000;
}
int _tmain(int argc, _TCHAR* argv[])
{
while(true)
{
printf("CPU frequency = %f\n",ProcSpeedCalc());
Sleep(1000);
}
return 0;
}
また、AMD CPU で最後の方法をテストしたことにも言及する必要があります。RdTSC メソッドの他のコードもいくつか試しましたが、正しく動作するものはありませんでした。
最後に、このプログラムhttps://code.google.com/p/open-hardware-monitor/source/browse/を作成するために使用されるコードを理解しようとしましたが、私には複雑すぎました。
だから、私の質問は: C++ または C# を使用して (CPU がオーバークロックされている場合でも) リアルタイムで CPU 周波数を決定する方法は? この質問が何度も聞かれたことは知っていますが、実際に私の質問に答えてくれる人はいません。