20

クロスプラットフォームのプロファイリングスイートに取り組んでおり、各実行のレポートにマシンのCPU(アーキテクチャ/クロック速度/コア)とRAM(合計)に関する情報を追加したいと思います。現在、WindowsとUnixをターゲットにする必要があるので、両方のプラットフォームからこの情報を取得する方法が必要です。手がかりはありますか?

編集:すばらしい回答をありがとう、CPUアーキテクチャ、コアのCPU数、合計メモリを取得しましたが、CPUのクロック速度がまだ不足しているので、そのアイデアはありますか?

4

13 に答える 13

13

Windows マシンで必要な情報を取得する方法の 1 つを次に示します。実際のプロジェクトからいくつかの小さな変更を加えてコピーして貼り付けたので、より意味のあるものにするために自由にクリーンアップしてください。

        int CPUInfo[4] = {-1};
        unsigned   nExIds, i =  0;
        char CPUBrandString[0x40];
        // Get the information associated with each extended ID.
        __cpuid(CPUInfo, 0x80000000);
        nExIds = CPUInfo[0];
        for (i=0x80000000; i<=nExIds; ++i)
        {
            __cpuid(CPUInfo, i);
            // Interpret CPU brand string
            if  (i == 0x80000002)
                memcpy(CPUBrandString, CPUInfo, sizeof(CPUInfo));
            else if  (i == 0x80000003)
                memcpy(CPUBrandString + 16, CPUInfo, sizeof(CPUInfo));
            else if  (i == 0x80000004)
                memcpy(CPUBrandString + 32, CPUInfo, sizeof(CPUInfo));
        }
        //string includes manufacturer, model and clockspeed
        cout << "CPU Type: " << CPUBrandString << endl;


        SYSTEM_INFO sysInfo;
        GetSystemInfo(&sysInfo);
        cout << "Number of Cores: " << sysInfo.dwNumberOfProcessors << endl;

        MEMORYSTATUSEX statex;
        statex.dwLength = sizeof (statex);
        GlobalMemoryStatusEx(&statex);
        cout << "Total System Memory: " << (statex.ullTotalPhys/1024)/1024 << "MB" << endl;

詳細については、GetSystemInfoGlobalMemoryStatusEx、および__cpuidを参照してください。含めませんでしたが、GetSystemInfo 関数を使用して、OS が 32 ビットか 64 ビットかを判断することもできます。

于 2009-05-12T01:53:34.637 に答える
10

Windowsでは、GlobalMemoryStatusExを使用して実際のRAMの容量を取得できます。

プロセッサ情報は、GetSystemInfoを介して取得できます。

于 2009-05-12T01:44:08.643 に答える
7

Windows で CPU クロック速度を決定するには:

double CPUSpeed()
{
    wchar_t Buffer[_MAX_PATH];
    DWORD BufSize = _MAX_PATH;
    DWORD dwMHz = _MAX_PATH;
    HKEY hKey;

    // open the key where the proc speed is hidden:
    long lError = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
                                L"HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0",
                                0,
                                KEY_READ,
                                &hKey);
    if(lError != ERROR_SUCCESS)
    {// if the key is not found, tell the user why:
        FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
                        NULL,
                        lError,
                        0,
                        Buffer,
                        _MAX_PATH,
                        0);
        wprintf(Buffer);
        return 0;
    }

    // query the key:
    RegQueryValueEx(hKey, L"~MHz", NULL, NULL, (LPBYTE) &dwMHz, &BufSize);
    return (double)dwMHz;
}
于 2009-05-12T02:43:52.277 に答える
6

CPUは簡単です。cpuid命令を使用してください。システムに搭載されているRAMの量を判断するためのポータブルな方法を見つけるために、他のポスターを残しておきます。:-)

Linux固有のメソッドの場合は、アクセスできます/proc/meminfo(また、応答/proc/cpuinfoの解析に煩わされない場合は)。cpuid

于 2009-05-12T01:41:26.760 に答える
5

Linuxでは、/ proc / cpuinfo(各プロセッサに関する情報のブロックを含む)および/ proc / meminfo(MemTotalを含むさまざまな一般的なメモリ統計を含む)を解析できます。

于 2009-05-12T01:42:10.473 に答える
1

Solaris の場合:

-メモリ用

 prtconf | grep Memory

-CPU用

 psrinfo -v | grep MHz
于 2009-05-12T02:15:09.530 に答える
1

http://en.wikipedia.org/wiki/CPUID CPUID に役立つ場合があります

于 2009-05-12T04:19:24.973 に答える
1

OPは、WindowsとLinuxの間で移植可能なCPUクロック速度計算ルーチンを望んでいます。どうぞ:

#ifdef WIN32
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
typedef unsigned __int64 usCount;
static usCount GetUsCount()
{
    static LARGE_INTEGER ticksPerSec;
    static double scalefactor;
    LARGE_INTEGER val;
    if(!scalefactor)
    {
        if(QueryPerformanceFrequency(&ticksPerSec))
            scalefactor=ticksPerSec.QuadPart/1000000000000.0;
        else
            scalefactor=1;
    }
    if(!QueryPerformanceCounter(&val))
        return (usCount) GetTickCount() * 1000000000;
    return (usCount) (val.QuadPart/scalefactor);
}
#else
#include <sys/time.h>
#include <time.h>
#include <sched.h>
typedef unsigned long long usCount;
static usCount GetUsCount()
{
#ifdef CLOCK_MONOTONIC
    struct timespec ts;
    clock_gettime(CLOCK_MONOTONIC, &ts);
    return ((usCount) ts.tv_sec*1000000000000LL)+ts.tv_nsec*1000LL;
#else
    struct timeval tv;
    gettimeofday(&tv, 0);
    return ((usCount) tv.tv_sec*1000000000000LL)+tv.tv_usec*1000000LL;
#endif
}
#endif
static usCount usCountOverhead, CPUClockSpeed;
#ifdef __GNUC__
#include "x86intrin.h"
#define __rdtsc() __builtin_ia32_rdtsc()
#endif
static usCount GetClockSpeed()
{
  int n;
  usCount start, end, start_tsc, end_tsc;
  if(!usCountOverhead)
  {
    usCount foo=0;
    start=GetUsCount();
    for(n=0; n<1000000; n++)
    {
      foo+=GetUsCount();
    }
    end=GetUsCount();
    usCountOverhead=(end-start)/n;
  }
  start=GetUsCount();
  start_tsc=__rdtsc();
  for(n=0; n<1000; n++)
#ifdef WIN32
    Sleep(0);
#else
    sched_yield();
#endif
  end_tsc=__rdtsc();
  end=GetUsCount();
  return (usCount)((1000000000000.0*(end_tsc-start_tsc))/(end-start-usCountOverhead));
}

明らかに、これは x86/x64 でのみ機能し、CPU と同じ速度でカウントする TSC に依存しています。私の場合など、奇妙なオーバークロックを行った場合、FSBをオーバークロックしますが、コアクロックを仕様に保つために乗数をダウンレートします。そのため、TSCはFSBに最大乗数を掛けたものをカウントしますが、これは速すぎます。

最良の結果を得るには、GetClockSpeed() を実行する前に、アンチ SpeedStep ループを実行することをお勧めします。

usCount start;
start=GetUsCount();
while(GetUsCount()-start<3000000000000ULL);
CPUClockSpeed=GetClockSpeed();

ニール

于 2012-03-17T20:24:36.157 に答える
0

WMIサービスを使用して最大クロック速度を取得するコードをいくつか書きました.VB.netであることは知っていますが、アイデアを示しています:

''' <summary>
''' Use WMI to get the Clock Speed in Hz
''' </summary>
Public Function GetMaxClockSpeedInHz() As Double
    Dim manObj = New ManagementObject("Win32_Processor.DeviceID='CPU0'")
    manObj.Get()
    GetMaxClockSpeedInHz = Convert.ToInt32(manObj.Properties("MaxClockSpeed").Value)
End Function

Win32_OperatingSystem リファレンス: http://msdn.microsoft.com/en-us/library/Aa394239

WMI リファレンス : http://msdn.microsoft.com/en-us/library/aa394572(v=VS.85).aspx

于 2011-05-23T14:49:25.193 に答える