514 votes

Trouver par programme le nombre de cœurs sur une machine

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)?

772voto

paxos1977 Points 25088

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];

214voto

Ferruccio Points 51508

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.

65voto

macbirdie Points 9417

OpenMP est pris en charge sur de nombreuses plateformes (y compris Visual Studio 2005) et offre un

 int omp_get_num_procs();
 

fonction qui renvoie le nombre de processeurs / cœurs disponibles au moment de l'appel.

39voto

Head Geek Points 10874

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. :-)

35voto

Dirk-Jan Kroon Points 211

(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
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X