私は、CPUに関する情報を読んでそれらを(CPU-Zのように)ユーザに表示するC#ソフトウェアを作ろうとしています。 私の現在の問題は、CPU周波数を表示する方法を見つけられなかったことです。CPUの周波数を得るための助けが必要です
まず、Win32_Processorクラスを使用して簡単な方法を試しました。 CPUがオーバークロック(またはアンダークロック)されている場合を除いて、非常に効率的でした。
はその後、私はシステム\ CentralProcessorは、CPUの "標準" クロック(オーバークロックしても)\ 0 \私のレジストリはHKLM \ HARDWAREの\説明に含まれていることを発見しました。問題は、現代のCPUでは、CPUがフルパワーを必要としないときにコア・マルチプライヤーが減少しているため、CPUの頻度も変化しますが、レジストリの値は変わりません。
次のステップでは、RdTSCを使用して実際にCPU周波数を計算しようとしていました。私はC++を使っていました。なぜなら、メソッドが動作していれば、C#プロジェクトに埋め込むことができるからです。私はhttp://www.codeproject.com/Articles/7340/Get-the-Processor-Speed-in-two-simple-ways に次のコードを見つけましたが、問題は同じでした:プログラムは私に最高の頻度(レジストリ値のように、1-2Mhzの差異)しか与えません。私はさらに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メソッドのいくつかのコードを試しましたが、正しく動作していません。
最後に、私はこのプログラムを作成するために使用されたコードを理解しようとしましたが、それはあまりにも複雑すぎました。
私の質問は、C + +やC#を使用して(CPUがオーバークロックされている場合でも)リアルタイムでCPU周波数を決定する方法ですか?私はこの質問が何度も尋ねられたことを知っていますが、実際に私の質問に答えている人はいません。
ハイゼンベルグは87年前にこの正確さを得ることができないと予測しました。この質問に対する答えが必要でないことを確認してください。 –
@ハンス:私はHeisenbergに問題を起こさないように希望の精度があると確信しています。 –
私は、オーバークロックされているシステムであってもC/C++でこれを行う方法を示す答えを出しました。 –