CPU에 관한 정보를 읽고이를 CPU-Z와 같이 사용자에게 표시하는 C# 소프트웨어를 만들려고합니다. 현재 문제는 CPU 빈도를 표시하는 방법을 찾지 못했기 때문입니다.CPU 주파수를 얻는 데 도움이 필요합니다.
처음에는 Win32_Processor 클래스을 사용하여 쉬운 방법을 시도했습니다. CPU가 오버 클럭 된 경우 (또는 언더 클럭 된 경우)를 제외하고는 매우 효율적입니다.
그럼, 내 레지스트리 HKLM \ 하드웨어 \ 설 \ 시스템에 포함 된 것을 발견 \ 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 주파수를 결정하는 것입니다? 나는이 질문이 많은 시간을 물었지만 아무도 실제로 내 질문에 답하지 않는다는 것을 안다.
하이젠 베르크 (Heisenberg)는 87 년 전에 이것을 정확히 예측할 수 없다고 예측했습니다. 이 질문에 대한 답이 필요하지 않은지 확인하십시오. –
@ 한스 : 원하는 정확도가 하이젠 베르크에서 문제를 일으키지 않을 것이라고 확신합니다. –
나는 오버 클러킹 된 시스템에서도 C/C++로이를 수행하는 방법을 보여주는 답을 주었다. –