macos - titel - Wie finde ich die Anzahl der*logischen*Kerne unter Mac OS X?




title tag wordpress (8)

Auf einem MacBook Pro, auf dem Mavericks läuft , sysctl -a | grep hw.cpu sysctl -a | grep hw.cpu gibt nur einige kryptische Details zurück. machdep.cpu Abschnitt machdep.cpu viel detailliertere und leichter zugängliche Informationen:

sysctl -a | grep machdep.cpu

Insbesondere für Prozessoren mit HyperThreading (HT) sehen Sie die Gesamtzahl der aufgelisteten CPUs ( logical_per_package ) doppelt so logical_per_package wie die Anzahl der physischen cores_per_package ( cores_per_package ).

sysctl -a | grep machdep.cpu  | grep per_package

Wie können Sie über die Befehlszeile feststellen, wie viele Kerne sich auf dem Computer befinden, wenn Sie Mac OS X ausführen? Unter Linux verwende ich:

x=$(awk '/^processor/ {++n} END {print n+1}' /proc/cpuinfo)

Es ist nicht perfekt, aber es ist nah. Dies soll gefüttert werden, weshalb es ein Ergebnis 1 höher als die tatsächliche Anzahl ergibt. Und ich weiß, dass der obige Code in Perl dichter geschrieben werden kann oder mit grep, wc und cut geschrieben werden kann, aber ich entschied, dass das obige ein guter Kompromiss zwischen Prägnanz und Lesbarkeit war.

SEHR SPÄNE BEARBEITEN: Nur um zu verdeutlichen: Ich frage, wie viele logische Kerne verfügbar sind, denn das entspricht der Anzahl der gleichzeitigen Jobs, die ich spawnen möchte. Die Antwort von jkp, weiter verfeinert von Chris Lloyd, war genau das , was ich brauchte. YMMV.


Der folgende Befehl gibt Ihnen alle Informationen über Ihre CPU

$ sysctl -a | sort | grep cpu

Kommentare für 2 gute Antworten oben:

1) Re die angenommene Antwort (und Kommentare) von jkp: hw.ncpu ist offenbar zugunsten von hw.logicalcpu ( https://ghc.haskell.org/trac/ghc/ticket/8594 ) veraltet

2) re das Update 2014 von Karl Ehr: auf meinem Computer (mit 2.5 GHz Intel Core i7), sysctl -a | grep machdep.cpu | grep per_package sysctl -a | grep machdep.cpu | grep per_package sysctl -a | grep machdep.cpu | grep per_package gibt verschiedene Zahlen zurück:

machdep.cpu.logical_per_package: 16

machdep.cpu.cores_per_package: 8

Die gewünschten Werte sind:

machdep.cpu.core_count: 4

machdep.cpu.thread_count: 8

Welches Spiel:

hw.physicalcpu: 4

hw.logicalcpu: 8


Sie können dies mit dem Dienstprogramm sysctl tun:

sysctl -n hw.ncpu


Um dies in C zu tun, können Sie die sysctl (3) -Familie von Funktionen verwenden:

int count;
size_t count_len = sizeof(count);
sysctlbyname("hw.logicalcpu", &count, &count_len, NULL, 0);
fprintf(stderr,"you have %i cpu cores", count);

Interessante Werte, die anstelle von "hw.logicalcpu" verwendet werden, zählen:

hw.physicalcpu - The number of physical processors available in the current power management mode.

hw.physicalcpu_max - The maximum number of physical processors that could be available this boot.

hw.logicalcpu - The number of logical processors available in the current power management mode.

hw.logicalcpu_max - The maximum number of logical processors that could be available this boot.

Verwende den system_profiler | grep "Cores" system_profiler | grep "Cores" Befehl.

Ich habe ein:

MacBook Pro Retina, Mitte 2012.

Prozessor: 2,6 GHz Intel Core i7

user$ system_profiler | grep "Cores"
      Total Number of Cores: 4
user$ sysctl -n hw.ncpu
8

Laut Wikipedia ( http://en.wikipedia.org/wiki/Intel_Core#Core_i7 ) gibt es keinen Core i7 mit 8 physischen Kernen, daher muss die Hyperthreading- Idee der Fall sein. Ignoriere sysctl und verwende den system_profiler Wert für die Genauigkeit. Die eigentliche Frage ist, ob Sie Anwendungen mit 4 Kernen (lange Compile-Jobs) effizient ausführen können, ohne andere Prozesse zu unterbrechen.

Das Ausführen eines Compilers, der mit 4 Kernen parallelisiert wird, scheint reguläre OS-Vorgänge nicht zu beeinträchtigen. Es ist also nicht so schlimm, es als 8 Kerne zu behandeln.


system_profiler SPHardwareDataType zeigt, dass ich 1 Prozessor und 4 Kerne habe.

[~] system_profiler SPHardwareDataType Hardware:

Hardware Overview:

  Model Name: MacBook Pro
  Model Identifier: MacBookPro9,1
  Processor Name: Intel Core i7
  Processor Speed: 2.6 GHz
  Number of Processors: 1
  Total Number of Cores: 4

  <snip>

[~]

Sysctl ist jedoch anderer Meinung:

[~] sysctl -n hw.logicalcpu 8 [~] sysctl -n hw.physicalcpu 4 [~]

Aber sysctl scheint korrekt zu sein, denn wenn ich ein Programm starte, das alle CPU-Steckplätze belegt, sehe ich, dass dieses Programm fast 800% der CPU-Zeit beansprucht (oben):

PID BEFEHL% CPU
4306 oben 5.6
4304 Java 745.7 4296 Ort 0.0


KLÄRUNG

Als diese Frage gestellt wurde, sagte der OP nicht, dass er die Anzahl der LOGICAL Kerne lieber als die tatsächliche Anzahl der Kerne wollte, also antwortet diese Antwort logisch (kein Wortspiel beabsichtigt) mit einer Möglichkeit, die tatsächliche Anzahl der realen physischen Kerne zu erhalten die Nummer, die das Betriebssystem durch Hyperthreading-Voodoo zu virtualisieren versucht.

AKTUALISIEREN SIE DEN FLAG IN YOSEMITE

Aufgrund eines seltsamen bug in OS X Yosemite (und möglicherweise neueren Versionen, wie dem kommenden El Capitan) habe ich eine kleine Modifikation vorgenommen. (Die alte Version funktionierte immer noch sehr gut, wenn Sie STDERR einfach ignorieren, was alles die Modifikation für Sie ist.)

Jede andere Antwort auch hier gegeben

  1. gibt falsche Informationen
  2. gibt aufgrund eines Fehlers in der Befehlsimplementierung keine Informationen
  3. läuft unglaublich langsam (dauert den größten Teil einer Minute ), oder
  4. gibt zu viele Daten und kann daher für die interaktive Verwendung nützlich sein, ist aber nutzlos, wenn Sie die Daten programmgesteuert verwenden möchten (z. B. als Eingabe für einen Befehl wie bundle install --jobs 3 wo Sie die Zahl anstelle von 3 möchten um eins weniger als die Anzahl der Kerne, die Sie haben, oder zumindest nicht mehr als die Anzahl der Kerne)

Der Weg, um nur die Anzahl der Kerne zuverlässig, richtig, relativ schnell und ohne zusätzliche Informationen oder sogar zusätzliche Zeichen um die Antwort zu erhalten, ist dies:

system_profiler SPHardwareDataType 2> /dev/null | grep 'Total Number of Cores' | cut -d: -f2 | tr -d ' '




makefile