web-dev-qa-db-fra.com

Comment découvrir le nombre de * cœurs * logiques sur Mac OS X?

Comment pouvez-vous savoir, à partir de la ligne de commande, combien de cœurs se trouvent sur la machine lorsque vous utilisez Mac OS X? Sous Linux, j'utilise:

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

Ce n'est pas parfait, mais c'est proche. Ceci est destiné à être nourri à make, c'est pourquoi il donne un résultat 1 supérieur au nombre réel. Et je sais que le code ci-dessus peut être écrit plus dense en Perl ou en utilisant grep, wc et cut, mais j’ai décidé que ce qui précède était un bon compromis entre concision et lisibilité.

TRES TARD EDIT: Juste pour préciser: je demande combien de cœurs logiques sont disponibles, car cela correspond à travaux simultanés que je veux que make génère. La réponse de jkp, affinée par Chris Lloyd, était exactement exactement ce dont j'avais besoin. YMMV.

360
Mike DeSimone

Vous pouvez le faire en utilisant l’utilitaire sysctl :

sysctl -n hw.ncpu
761
jkp

Encore plus facile:

sysctl -n hw.ncpu
128
mlbright

Cela devrait être multi-plateforme. Au moins pour Linux et Mac OS X.

python -c 'import multiprocessing as mp; print(mp.cpu_count())'

Un peu lent mais ça marche.

27
Frozen Flame

Pour faire cela en C, vous pouvez utiliser la famille de fonctions sysctl (3):

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

Les valeurs intéressantes à utiliser à la place de "hw.logicalcpu", qui compte les cœurs, sont:

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.
18
alfwatt

system_profiler SPHardwareDataType montre que j'ai 1 processeur et 4 cœurs.

[~] 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>

[~]

Cependant, sysctl n'est pas d'accord:

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

Mais sysctl semble correct, car lorsque je lance un programme qui doit occuper tous les emplacements de processeur, je vois ce programme prendre près de 800% du temps de calcul (en haut):

PID COMMAND% CPU
4306 top 5.6
4304 Java 745.7 4296 emplacement 0.0

10
user1706991
$ system_profiler | grep 'Total Number Of Cores'
9
kent

Utilisez la commande system_profiler | grep "Cores".

J'ai un:

MacBook Pro Retina, mi-2012.

Processeur: Intel Core i7 à 2,6 GHz

user$ system_profiler | grep "Cores"
      Total Number of Cores: 4

user$ sysctl -n hw.ncpu
8

Selon Wikipedia, ( http://en.wikipedia.org/wiki/Intel_Core#Core_i7 ) il n'y a pas de Core i7 à 8 cœurs physiques, donc l'hyperthreading idée doit être le cas. Ignorez sysctl et utilisez la valeur system_profiler pour plus de précision. La vraie question est de savoir si vous pouvez exécuter efficacement des applications avec 4 cœurs (travaux de compilation longs?) Sans interrompre les autres processus.

L'exécution d'un compilateur parallélisé avec 4 cœurs ne semble pas affecter considérablement les opérations normales du système d'exploitation. Alors peut-être que le traiter comme 8 noyaux n'est pas si grave.

8
NetworkN8

Comme jkp l’a dit dans un commentaire, cela ne montre pas le nombre réel de cœurs physiques. Pour obtenir le nombre de cœurs physiques, vous pouvez utiliser la commande suivante:

system_profiler SPHardwareDataType
7
Tohid

La commande suivante vous donne toutes les informations sur votre CPU

$ sysctl -a | sort | grep cpu
3
asmaier

Sur un MacBook Pro exécutant Mavericks, sysctl -a | grep hw.cpu ne renverra que certains détails cryptés. Des informations beaucoup plus détaillées et accessibles sont révélées dans la section machdep.cpu, à savoir:

sysctl -a | grep machdep.cpu

En particulier, pour les processeurs avec HyperThreading (HT), le nombre total de CPU énumérés (logical_per_package) est égal à deux fois le nombre de cœurs physiques (cores_per_package).

sysctl -a | grep machdep.cpu  | grep per_package
1
Karl Ehr

CLARIFICATION

Lorsque cette question a été posée, l’opérateur n’a pas indiqué qu’il voulait le nombre de cœurs LOGICAL plutôt que le - nombre réel de cœurs, donc cette réponse répond logiquement (sans jeu de mots) à un moyen d'obtenir le nombre actuel de cœurs physiques réels, et non le nombre que le système d'exploitation tente de virtualiser hyperthreading vaudou.

MISE À JOUR POUR GÉRER LA FLAW À YOSEMITE

En raison d'un étrange bug sous OS X Yosemite (et peut-être de nouvelles versions, telles que le prochain El Capitan), j'ai apporté une petite modification. (L'ancienne version fonctionnait toujours parfaitement si vous ignoriez simplement STDERR, ce que toutes les modifications font pour vous.)


Toute autre réponse donnée ici non plus

  1. donne des informations incorrectes
  2. ne donne aucune information, à cause d'une erreur dans l'implémentation de la commande
  3. court incroyablement lentement (en prenant la majeure partie d'un minute à compléter), ou
  4. donne trop de données, et pourrait donc être utile pour une utilisation interactive, mais est inutile si vous souhaitez utiliser les données par programme (par exemple, en entrée d'une commande telle que bundle install --jobs 3 où vous voulez que le nombre soit remplacé par 3 être un de moins que le nombre de cœurs que vous avez, ou du moins pas plus que le nombre de cœurs)

Voici comment obtenir le nombre de cœurs de manière fiable, correcte, raisonnablement rapide et sans informations ni même caractères supplémentaires autour de la réponse:

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

Commentaires pour 2 bonnes réponses ci-dessus:

1) Concernant la réponse acceptée (et les commentaires) de jkp: hw.ncpu est apparemment déconseillé au profit de hw.logicalcpu ( https://ghc.haskell.org/trac/ghc/ticket/8594 )

2) concernant la mise à jour 2014 de Karl Ehr: sur mon ordinateur (avec 2,5 ghz intel core i7), sysctl -a | grep machdep.cpu | grep per_package renvoie différents numéros:

machdep.cpu.logical_per_package: 16

machdep.cpu.cores_per_package: 8

Les valeurs souhaitées sont:

machdep.cpu.core_count: 4

machdep.cpu.thread_count: 8

Quel match:

hw.physicalcpu: 4

hw.logicalcpu: 8

0
Mark