需求
我們在編程時,尤其是在涉及到系統內容的程式開發中,可能會需要動態獲得當前機器中可用的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庫提供了另外一種擷取機器可用核心數的方法。函數intget_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)類似,真正的反映了當前可用核心數。
跨平台函數
跨平台的擷取系統當前可用核心數的函數如下所示:
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}小結
擷取系統當前可用核心數,是並行計算中確定並行度的一種常用方法,通過本文的小函數,可用學到如何擷取當前可用核心數。