c編程技巧——擷取可用的處理器(CPU)核心數

來源:互聯網
上載者:User
需求

我們在編程時,尤其是在涉及到系統內容的程式開發中,可能會需要動態獲得當前機器中可用的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}
小結

擷取系統當前可用核心數,是並行計算中確定並行度的一種常用方法,通過本文的小函數,可用學到如何擷取當前可用核心數。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.