Ermitteln Sie programmgesteuert die Anzahl der Kerne auf einem Computer

Lesezeit: 7 Minuten

Ermitteln Sie programmgesteuert die Anzahl der Kerne auf einem Computer
hazz

Gibt es eine Möglichkeit, plattformunabhängig zu bestimmen, wie viele Kerne eine Maschine von C/C++ hat? Wenn es so etwas nicht gibt, was ist mit der Bestimmung pro Plattform (Windows/*nix/Mac)?

  • Wenn Sie damit herausfinden möchten, wie viele Threads gestartet werden sollen, verwenden Sie bitte NUMBER_OF_PROCESSORS als primäres Maß. Ich überlasse es Ihnen als Übung, warum dies viel besser ist (wenn die Leute es häufiger verwenden würden) als die Verwendung von Hardwarekernen. Wie viel Kerne zu Ihrem Programm gehören, ist eine Umweltfrage!

    – Lothar

    14. Dezember 2012 um 19:55 Uhr

  • Beachten Sie, dass std::thread::hardware_concurrency gibt die Anzahl der physischen CPU-Kerne zurück, aber nproc in Linux zeigt nur die Anzahl der CPU-Kerne an, auf denen der aktuelle Prozess ausgeführt werden kann, mit denen gesteuert werden kann sched_setaffinity. Ich habe keinen Weg gefunden, das stattdessen aus Standard-C++ zu bekommen:, siehe zB in Python: stackoverflow.com/questions/1006289/…

    – Ciro Santilli Путлер Капут 六四事

    5. Mai 2019 um 18:52 Uhr

Ermitteln Sie programmgesteuert die Anzahl der Kerne auf einem Computer
paxos1977

C++11

#include <thread>

//may return 0 when not able to detect
const auto processor_count = std::thread::hardware_concurrency();

Referenz: std::thread::hardware_concurrency


In C++ vor C++11 gibt es keinen portablen Weg. Stattdessen müssen Sie eine oder mehrere der folgenden Methoden verwenden (geschützt durch entsprechende #ifdef Linien):

  • Win32

    SYSTEM_INFO sysinfo;
    GetSystemInfo(&sysinfo);
    int numCPU = sysinfo.dwNumberOfProcessors;
    
  • Linux, Solaris, AIX und Mac OS X >=10.4 (d. h. ab Tiger)

    int numCPU = sysconf(_SC_NPROCESSORS_ONLN);
    
  • FreeBSD, MacOS X, NetBSD, OpenBSD usw.

    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 oder iOS)

    NSUInteger a = [[NSProcessInfo processInfo] processorCount];
    NSUInteger b = [[NSProcessInfo processInfo] activeProcessorCount];
    

  • @mcandre: Das bleibt dem Leser als Übung überlassen. Wenn ich implementieren würde, würde ich wahrscheinlich den Template-Policy-Ansatz verwenden, bei dem die Richtlinie in Präprozessordirektiven definiert wurde. Oder … Sie könnten boost thread::hardware_concurrency() verwenden.

    – paxos1977

    22. Juni 2010 um 20:26 Uhr

  • Zur Verdeutlichung gibt die Win32-Lösung die Gesamtzahl der Kerne (wonach gefragt wurde) und nicht die Gesamtzahl der physischen CPUs zurück.

    – Erich

    3. Februar 2011 um 17:59 Uhr


  • Der Linux/Solaris/AIX-Weg funktioniert auch unter FreeBSD und hat das seit mindestens 2006. Außerdem bringt das die CPUs wieder online, wenn ein System in der Lage ist, einige auszuschalten, werden sie möglicherweise nicht gezählt. Der Aufruf von sysconf mit „_SC_NPROCESSORS_CONF“ gibt die Gesamtzahl der konfigurierten CPUs zurück.

    – Chris S

    23. April 2011 um 18:43 Uhr

  • Ein paar Dinge, die Sie beachten sollten. HW_NCPU ist unter OS X veraltet. Unter Windows GetSystemInfo ist nur sinnvoll, wenn Ihr System über 32 logische Prozessoren oder weniger verfügt GetLogicalProcessorInformation für Systeme mit mehr als 32 logischen Prozessoren.

    Benutzer152949

    26. Februar 2013 um 10:40 Uhr

  • @Trejkaz die Dokumentation sagt eindeutig “logisch” – was immer HT-Kerne zählt, das Wort “körperlich” immer bezieht sich auf Kerne, die vom BIOS / UEFI gemeldet werden, da Kerne auch emuliert / virtualisiert werden können. Sie können zwischen HT-/Nicht-HT-Kernen mit Funktionen wie unterscheiden GetLogicalProcessorInformation, zum Beispiel. Hinweis: HT != Emulation oder Virtualisierung, das ist a groß Unterschied, HT ist sozusagen eine Hardwareoptimierung

    – spezialist

    27. Juni 2016 um 9:02 Uhr


1646932210 493 Ermitteln Sie programmgesteuert die Anzahl der Kerne auf einem Computer
Ferruccio

Diese Funktionalität ist Teil des C++11-Standards.

#include <thread>

unsigned int nthreads = std::thread::hardware_concurrency();

Für ältere Compiler können Sie die verwenden Boost.Thread Bücherei.

#include <boost/thread.hpp>

unsigned int nthreads = boost::thread::hardware_concurrency();

In beiden Fällen, hardware_concurrency() gibt die Anzahl der Threads zurück, die die Hardware basierend auf der Anzahl der CPU-Kerne und Hyper-Threading-Einheiten gleichzeitig ausführen kann.

  • Seconded … wollte den obigen Beispielcode und einige Präprozessormakros verwenden, um eine einzelne Funktion verfügbar zu machen, aber die harte Arbeit wurde für mich erledigt.

    – jkp

    22. Mai 2009 um 8:35 Uhr

  • Für win32 ist es ein Aufruf von GetSystemInfo. (Ab Boost-Version 1.41.0) Erfasst das alle Informationen, um zu bestimmen, wie viele Worker-Threads effektiv wären? Muss man sowohl die Anzahl der Kerne als auch Hyper-Threading berücksichtigen? unsigned thread::hardware_concurrency() { SYSTEM_INFO info={0}; GetSystemInfo(&info); info.dwNumberOfProcessors zurückgeben; }

    – Jive Dadson

    21. April 2010 um 19:51 Uhr


  • Laut MSDN gibt GetSystemInfo() die Anzahl der “physischen Prozessoren” in dwNumberOfProcessors zurück, definiert aber nicht, was damit gemeint ist. Die Boost-Dokumentation scheint zu behaupten, dass sie Hyperthreading-Einheiten enthält.

    – Ferruccio

    21. April 2010 um 20:26 Uhr

  • siehe stackoverflow.com/questions/642348/… für Hyperthreading

    – Nautur

    6. Mai 2010 um 10:58 Uhr

1646932210 493 Ermitteln Sie programmgesteuert die Anzahl der Kerne auf einem Computer
Makrele

OpenMP wird auf vielen Plattformen (einschließlich Visual Studio 2005) unterstützt und bietet a

int omp_get_num_procs();

Funktion, die die Anzahl der zum Zeitpunkt des Aufrufs verfügbaren Prozessoren/Kerne zurückgibt.

  • weil es eine falsche Antwort ist. Von gcc.gnu.org/bugzilla/show_bug.cgi?id=37586 “omp_get_num_procs () gibt nur eine kleinere Zahl als die Anzahl der System-CPUs online zurück, wenn GOMP_CPU_AFFINITY env var verwendet wird oder wenn der aufrufende Prozess und/oder Thread eine CPU-Affinität hat, die auf eine Teilmenge von CPUs beschränkt ist.” Wenn Sie also früher anrufen, z. sched_setaffinity das wird nicht funktionieren.

    – wieder oder

    11. November 2013 um 11:53 Uhr


  • Diese Funktion gibt die Anzahl der CPUs zurück, die dem aufrufenden Prozess zur Verfügung stehen. Ist das nicht ohnehin der häufigste Anwendungsfall? Außerhalb einiger nutzloser Berichtszwecke ist die tatsächliche Anzahl der CPU-Hardwarekerne für Sie nicht relevant, wenn Sie sie nicht in Ihrem Code nutzen können.

    – Makrele

    14. November 2013 um 20:24 Uhr

  • @EvanTeran Abgesehen davon, dass es der Zweck der Frage war, kann es natürlich nützlich sein. Beispielsweise zum Einstellen der Thread-Affinität. Angenommen, ich möchte 4 Threads ausführen, die an die vier letzten CPU-Kerne auf meinem Computer gebunden sind, anstatt an die vier ersten Kerne. Außerdem gibt es außer OpenMP noch andere Möglichkeiten, den Code zu parallelisieren. Ich möchte vielleicht selbst pthreads spawnen. Diese sind sicherlich verfügbar und nicht durch OpenMP-Umgebungsvariablen eingeschränkt.

    – wieder oder

    25. November 2013 um 21:41 Uhr


  • Dies gibt die Anzahl der logischen CPUs zurück, nicht die Kerne (physische CPUs) als solche.

    – Michael Konečný

    10. Juni 2016 um 15:41 Uhr

1646932210 791 Ermitteln Sie programmgesteuert die Anzahl der Kerne auf einem Computer
Kopf Geek

Wenn Sie Zugriff auf Assembler haben, können Sie die CPUID-Anweisung verwenden, um alle möglichen Informationen über die CPU zu erhalten. Es ist zwischen Betriebssystemen portierbar, obwohl Sie herstellerspezifische Informationen verwenden müssen, um festzustellen, wie Sie die Anzahl der Kerne finden. Hier ist ein Dokument, das beschreibt, wie man es auf Intel-Chips machtund Seite 11 von Dieses hier beschreibt die AMD-Spezifikation.

(Fast) plattformunabhängige Funktion im C-Code

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

  • Scheint HW_NCPU ist unter OS X veraltet Quelle

    Benutzer152949

    26. Februar 2013 um 10:26 Uhr


  • @ user152949 Was ist die vorgeschlagene Alternative? (Link ist defekt)

    – Ideengeber42

    9. Oktober 2021 um 23:44 Uhr

1646932211 200 Ermitteln Sie programmgesteuert die Anzahl der Kerne auf einem Computer
JesperE

Unter Linux können Sie die Datei /proc/cpuinfo lesen und die Kerne zählen.

  • Scheint HW_NCPU ist unter OS X veraltet Quelle

    Benutzer152949

    26. Februar 2013 um 10:26 Uhr


  • @ user152949 Was ist die vorgeschlagene Alternative? (Link ist defekt)

    – Ideengeber42

    9. Oktober 2021 um 23:44 Uhr

1646932211 495 Ermitteln Sie programmgesteuert die Anzahl der Kerne auf einem Computer
tschepang

Beachten Sie, dass “Anzahl der Kerne” möglicherweise keine besonders nützliche Zahl ist, Sie müssen sie möglicherweise etwas näher qualifizieren. Wie wollen Sie Multithread-CPUs wie Intel HT, IBM Power5 und Power6 und vor allem Suns Niagara/UltraSparc T1 und T2 zählen? Oder noch interessanter, der MIPS 1004k mit seinen zwei Hardware-Threading-Ebenen (Supervisor- UND Benutzerebene) … Ganz zu schweigen davon, was passiert, wenn Sie in Hypervisor-unterstützte Systeme wechseln, in denen die Hardware möglicherweise Dutzende von CPUs hat, aber Ihr spezielles Betriebssystem sieht nur wenige.

Das Beste, worauf Sie hoffen können, ist, die Anzahl der logischen Verarbeitungseinheiten anzugeben, die Sie in Ihrer lokalen Betriebssystempartition haben. Vergessen Sie es, die wahre Maschine zu sehen, es sei denn, Sie sind ein Hypervisor. Die einzige Ausnahme von dieser Regel ist heute im x86-Land, aber das Ende nicht-virtueller Maschinen kommt schnell …

988530cookie-checkErmitteln Sie programmgesteuert die Anzahl der Kerne auf einem Computer

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy