CPUコア数を取得する

OpenMP に対応しているコンパイラなら、 omp_get_num_procs でも出来るが、CPU コアの割り当てなんかはプラットフォーム固有のものを使わないとできないので、結局 OS 依存で書いても変わらない。
というわけで、WindowsLinux 両方で使えるようなラッパー関数を作ることにした。

#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 はじまり