Il s'agit plus d'une question de curiosité que de quelque chose qui nécessite une résolution réelle, mais existe-t-il un moyen de déterminer le nombre de cœurs d'une machine à partir de C ++ indépendamment de la plate-forme? Si une telle chose n'existe pas, qu'en est-il de la déterminer par plate-forme (Windows / * nix / Mac)?
Réponses
Trop de publicités?C++11
http://en.cppreference.com/w/cpp/thread/thread/hardware_concurrency
//may return 0 when not able to detect
unsigned concurentThreadsSupported = std::thread::hardware_concurrency();
Win32:
SYSTEM_INFO sysinfo;
GetSystemInfo( &sysinfo );
numCPU = sysinfo.dwNumberOfProcessors;
Linux, Solaris et AIX et Mac OS X (pour tous les OS versions >= 10.4, c'est à dire, le Tigre à partir de) - par les commentaires:
numCPU = sysconf( _SC_NPROCESSORS_ONLN );
FreeBSD, MacOS X, NetBSD, OpenBSD, etc.:
int mib[4];
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:
numCPU = mpctl(MPC_GETNUMSPUS, NULL, NULL);
IRIX:
numCPU = sysconf( _SC_NPROC_ONLN );
Mac OS X (10.5 et version ultérieure) ou iOS (toute version) en Objective-C:
NSUInteger a = [[NSProcessInfo processInfo] processorCount];
NSUInteger b = [[NSProcessInfo processInfo] activeProcessorCount];
Cette fonctionnalité fait partie de la norme C ++ 11.
#include <thread>
unsigned int nthreads = std::thread::hardware_concurrency();
Pour les compilateurs plus anciens, vous pouvez utiliser la bibliothèque Boost.Thread .
#include <boost/thread.hpp>
unsigned int nthreads = boost::thread::hardware_concurrency();
Dans les deux cas, hardware_concurrency()
renvoie le nombre de threads que le matériel est capable d'exécuter simultanément en fonction du nombre de cœurs de processeur et d'unités d'hyper-threading.
Si vous avez de la langue de l'assembly d'accès, vous pouvez utiliser l'instruction CPUID pour obtenir toutes sortes d'informations sur le CPU. Il est portable entre les systèmes d'exploitation, mais vous aurez besoin d'utiliser du fabricant-informations spécifiques à déterminer comment trouver le nombre de cœurs. Voici un document qui explique comment le faire sur des puces d'Intel, et à la page 11 de ce l'on décrit les AMD spécification. Si vous avez besoin d'un exemple de code pour cela, il suffit de demander. :-)
(Presque) Plate-forme Fonction indépendante dans le code-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
}