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.
Vous pouvez le faire en utilisant l’utilitaire sysctl :
sysctl -n hw.ncpu
Encore plus facile:
sysctl -n hw.ncpu
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.
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.
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
$ system_profiler | grep 'Total Number Of Cores'
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.
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
La commande suivante vous donne toutes les informations sur votre CPU
$ sysctl -a | sort | grep cpu
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
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
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 ' '
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