需求
我們在編程時,尤其是在涉及到系統環境的程序開發中,可能會需要動態的獲得當前機器中可用的CPU核數。例如,當我們需要做並行計算時,我們可能會根據CPU核數來決定並行度,因此我們需要在C程序中獲得當前機器中可用的CPU核數。
方法
為了跨平台的需要,我們需要同時考慮在不同平台下獲取機器處理器核數的方法。在這裡我們考慮Linux與Windows兩個平台,不同的平台有不同的方法來獲取處理器核數。
在Windows平台下,我們可以使用GetSystemInfo( )這個函數來獲取當前系統的一些軟硬件信息。其中有一項即是當前機器中處理器的核數。通過如下語句即可獲得所要的信息:
SYSTEM_INFO info;
GetSystemInfo(&info);
return info.dwNumberOfProcessors;
而在Linux平台下,我們可以使用sysconf( )或者get_nprocs( )來獲取處理器核數。下面分別介紹:
sysconf( )有unistd.h提供,要使用該函數需要#include<unistd.h>,其參數可以是_SC_NPROCESSORS_CONF,也可以是_SC_NPROCESSORS_ONLN。sysconf(_SC_NPROCESSORS_CONF)返回系統可以使用的核數,但是其值會包括系統中禁用的核的數目,因此該值並不代表當前系統中可用的核數。而sysconf(_SC_NPROCESSORS_ONLN)的返回值真正的代表了系統當前可用的核數。
GNU C庫提供了另外一種獲取機器可用核數的方法。函數int
get_nprocs_conf (void),int get_nprocs (void)在 sys/sysinfo.h中定義,這兩個函數可用獲取機器的核數。其中get_nprocs_conf (void)的返回值與sysconf(_SC_NPROCESSORS_CONF)類似,並不真正表名當前可用核數;而get_nprocs
(void)的返回值與sysconf(_SC_NPROCESSORS_ONLN)類似,真正的反映了當前可用核數。
跨平台函數
跨平台的獲取系統當前可用核數的函數如下所示:
[cpp]
Int_t get_CPU_core_num( )
{
#if defined(WIN32)
SYSTEM_INFO info;
GetSystemInfo(&info);
return info.dwNumberOfProcessors;
#elif defined(LINUX) || defined(SOLARIS) || defined(AIX)
return get_nprocs(); //GNU fuction
#else
#error 不支持的操作系統
#endif
}