플랫폼 독립적 인 방식으로 머신이 C / C ++의 코어 수를 결정하는 방법이 있습니까? 그러한 것이 없다면 플랫폼 별 (Windows / * nix / Mac)을 결정하는 것은 어떻습니까?
답변
C ++ 11
#include <thread>
//may return 0 when not able to detect
const auto processor_count = std::thread::hardware_concurrency();
참조 : std :: thread :: hardware_concurrency
C ++ 11 이전의 C ++에서는 이식 가능한 방법이 없습니다. 대신 다음 방법 중 하나 이상을 사용해야합니다 (적절한 #ifdef
행으로 보호 ).
-
Win32
SYSTEM_INFO sysinfo; GetSystemInfo(&sysinfo); int numCPU = sysinfo.dwNumberOfProcessors;
-
Linux, Solaris, AIX 및 Mac OS X> = 10.4 (즉, Tiger 이상)
int numCPU = sysconf(_SC_NPROCESSORS_ONLN);
-
FreeBSD, MacOS X, NetBSD, OpenBSD 등
int mib[4]; int numCPU; std::size_t len = sizeof(numCPU); /* set the mib for hw.ncpu */ mib[0] = CTL_HW; mib[1] = HW_AVAILCPU; // alternatively, try HW_NCPU; /* get the number of CPUs from the system */ sysctl(mib, 2, &numCPU, &len, NULL, 0); if (numCPU < 1) { mib[1] = HW_NCPU; sysctl(mib, 2, &numCPU, &len, NULL, 0); if (numCPU < 1) numCPU = 1; }
-
HPUX
int numCPU = mpctl(MPC_GETNUMSPUS, NULL, NULL);
-
IRIX
int numCPU = sysconf(_SC_NPROC_ONLN);
-
Objective-C (Mac OS X> = 10.5 또는 iOS)
NSUInteger a = [[NSProcessInfo processInfo] processorCount]; NSUInteger b = [[NSProcessInfo processInfo] activeProcessorCount];
답변
이 기능은 C ++ 11 표준의 일부입니다.
#include <thread>
unsigned int nthreads = std::thread::hardware_concurrency();
구형 컴파일러의 경우 Boost.Thread 라이브러리를 사용할 수 있습니다 .
#include <boost/thread.hpp>
unsigned int nthreads = boost::thread::hardware_concurrency();
두 경우 모두, hardware_concurrency()
CPU 코어 수와 하이퍼 스레딩 장치 수에 따라 하드웨어가 동시에 실행할 수있는 스레드 수를 반환합니다.
답변
OpenMP 는 많은 플랫폼 (Visual Studio 2005 포함)에서 지원되며
int omp_get_num_procs();
호출시 사용 가능한 프로세서 / 코어 수를 반환하는 함수입니다.
답변
어셈블리 언어 액세스 권한이있는 경우 CPUID 명령어를 사용하여 CPU에 대한 모든 종류의 정보를 얻을 수 있습니다. 운영 체제간에 이식 가능하지만 제조업체 별 정보를 사용하여 코어 수를 찾는 방법을 결정해야합니다. 다음 은 인텔 칩 에서 수행하는 방법을 설명하는 문서이며이 중 11 페이지 는 AMD 사양을 설명합니다.
답변
C 코드에서 (거의) 플랫폼 독립적 기능
#ifdef _WIN32
#include <windows.h>
#elif MACOS
#include <sys/param.h>
#include <sys/sysctl.h>
#else
#include <unistd.h>
#endif
int getNumCores() {
#ifdef WIN32
SYSTEM_INFO sysinfo;
GetSystemInfo(&sysinfo);
return sysinfo.dwNumberOfProcessors;
#elif MACOS
int nm[2];
size_t len = 4;
uint32_t count;
nm[0] = CTL_HW; nm[1] = HW_AVAILCPU;
sysctl(nm, 2, &count, &len, NULL, 0);
if(count < 1) {
nm[1] = HW_NCPU;
sysctl(nm, 2, &count, &len, NULL, 0);
if(count < 1) { count = 1; }
}
return count;
#else
return sysconf(_SC_NPROCESSORS_ONLN);
#endif
}
답변
Linux에서는 / proc / cpuinfo 파일을 읽고 코어를 계산할 수 있습니다.
답변
“코어 수”는 특히 유용한 숫자가 아닐 수 있으므로 조금 더 한정해야 할 수도 있습니다. Intel HT, IBM Power5 및 Power6과 같은 멀티 스레드 CPU와 Sun의 Niagara / UltraSparc T1 및 T2를 가장 잘 계산하려면 어떻게 하시겠습니까? 더 흥미로운 점은 두 가지 수준의 하드웨어 스레딩 (감독자 및 사용자 수준)을 갖춘 MIPS 1004k입니다. 하드웨어에 수십 개의 CPU가 있지만 특정 OS가있는 하이퍼 바이저 지원 시스템으로 이동할 때 발생하는 상황은 말할 것도 없습니다. 몇 개만 봅니다.
로컬 OS 파티션에있는 논리 처리 장치 수를 알려주는 것이 가장 좋습니다. 하이퍼 바이저가 아닌 한 실제 머신을 보는 것을 잊어 버리십시오. 오늘날이 규칙에 대한 유일한 예외는 x86 육상이지만, 비가 상 머신의 끝은 빨라지고 있습니다 …