2009-05-12 3 views
10

Я работаю над комплектом профилирования кросс-платформы и хотел бы добавить информацию о процессоре (архитектуре/тактовой частоте/ядрах) ядра и общей сумме ОЗУ (всего) в отчет каждого прогона. В настоящее время мне нужно настроить таргетинг на Windows и Unix, поэтому мне нужны методы для получения этой информации с обеих платформ, любые подсказки?Как определить аппаратное обеспечение (ЦП и ОЗУ) на машине?

Редактировать: Спасибо за отличные ответы. Теперь у меня есть архитектура процессора, количество ядер ядра и общая память, но мне все еще не хватает часов для процессора для каких-либо идей для этого?

+0

строка в результате __cpuinfo включает в себя clockspeed – bsruth

+0

@bsruth Спасибо, теперь я вижу, что это действительно в brandstring –

ответ

4

Процессор прост. Используйте инструкцию cpuid. Я оставлю другие плакаты, чтобы найти переносимый способ определения объема оперативной памяти в системе. :-)

Для Linux специфические методы, вы можете получить доступ к /proc/meminfo/proc/cpuinfo, если вы не можете быть обеспокоены, чтобы разобрать cpuid ответов).

+1

И, предположительно, как найти информацию о процессоре на процессоре, который не имеет какой-либо инструкции CPUID? ;) (Может ли CPUID рассказать вам, сколько ядер имеет процессорный пакет?) – araqnid

+1

Читайте: http://www.intel.com/design/processor/applnots/241618.htm (короткий ответ: да). Все ставки отключены, если процессор слишком стар, чтобы поддерживать cpuid, но ни одна из современных систем не имеет этой проблемы. –

+1

Я думал, что не все системы основаны на процессорах i386-архитектуры. (Хотя известно, что это, возможно, не было проблемой, о которой интересовал OP) – araqnid

3

В Linux вы можете анализировать/proc/cpuinfo (содержит блок информации для каждого процессора) и/proc/meminfo (содержит множество статистических данных общей памяти, включая MemTotal).

6

В Windows вы можете использовать GlobalMemoryStatusEx, чтобы получить объем фактической ОЗУ.

Информация о процессоре может быть получена через GetSystemInfo.

5

Вот один из способов получения необходимой информации на машине Windows. Я скопировал и вложил его из реального проекта с некоторыми незначительными изменениями, поэтому не стесняйтесь очищать его, чтобы иметь больше смысла.

 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; 

Для получения дополнительной информации см GetSystemInfo, GlobalMemoryStatusEx и __cpuid. Хотя я не включил его, вы также можете определить, является ли ОС 32 или 64 бит через функцию GetSystemInfo.

1

В Solaris:

-Для памяти

prtconf | grep Memory 

-Для CPU

psrinfo -v | grep MHz 
3

В Windows, чтобы определить частоту процессора скорость:

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; 
} 
+0

@ Анон Почему downvote? –

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

0

OP хочет вычислить обычную тактовую частоту процессора, переносимую между Windows и Linux.Здесь вы идете:

#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, и это зависит от TSC считая с той же скоростью, что и процессор. Если вы сделали странные разгоны, например. на шахте я разгонял FSB, но сокращал множитель, чтобы поддерживать часы ядра в спецификации, поэтому TSC будет рассчитывать на FSB раз максимальный множитель, который слишком быстр.

Чтобы получить наилучшие результаты, перед запуском GetClockSpeed ​​() Я предлагаю вам запустить цикл Anti-SpeedStep, например.

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

Найл

0

для Windows, и Win32 проектов C++:

http://www.codeguru.com/cpp/w-p/system/hardwareinformation/article.php/c9087/Three-Ways-to-Retrieve-Processor-Information.htm

выше URL и содержит статья демонстрирует 3 различных способа извлечения информации ЦП на Windows. Исходный код находится в нижней части статьи, хорошо написан и имеет три полезных класса, которые вы можете вызывать из кода Win32 C++.

 Смежные вопросы

  • Нет связанных вопросов^_^