CPUコア数を取得する
OpenMP に対応しているコンパイラなら、 omp_get_num_procs でも出来るが、CPU コアの割り当てなんかはプラットフォーム固有のものを使わないとできないので、結局 OS 依存で書いても変わらない。
というわけで、Windows と Linux 両方で使えるようなラッパー関数を作ることにした。
#include <stdio.h> #ifdef __linux #include <unistd.h> #elif __MINGW32__ #include <windows.h> #include <winbase.h> #endif int getCpuNum() { #ifdef __linux // for linux return sysconf(_SC_NPROCESSORS_CONF); #elif __MINGW32__ // for windows and wine SYSTEM_INFO info; GetSystemInfo(&info); return info.dwNumberOfProcessors; #endif } int main() { printf("cpu = %d\n", getCpuNum()); return 0; }
mingw32 で ifdef を切っているが、VC++ でも同じ方法でいける。
VC++ で使いたい場合は、#ifdef _WINDOWS にして、インクルードファイルを Windows.h にすれば良い。
CPU 割り当てをする API も書いておくことにする。
・Linux
pthread_setaffinity_np
CPUID は 0 はじまり
・Windows
SetThreadAffinityMask
CPUID は 1 はじまり