Ответ 1
Вы можете сделать это с помощью утилиты sysctl :
sysctl -n hw.ncpu
Как вы можете сказать, из командной строки, сколько ядер находится на компьютере, когда вы используете Mac OS X? В Linux я использую:
x=$(awk '/^processor/ {++n} END {print n+1}' /proc/cpuinfo)
Это не идеально, но это близко. Это предназначено для подачи на make
, поэтому он дает результат 1 выше фактического числа. И я знаю, что приведенный выше код может быть написан более плотным в Perl или может быть написан с использованием grep, wc и cut, но я решил, что это было хорошим компромиссом между лаконичностью и удобочитаемостью.
ОЧЕНЬ ПОСЛЕДНИЙ РЕДАКТИРОВАТЬ: Просто пояснить: я спрашиваю, сколько логических ядер доступно, потому что это соответствует тому, сколько одновременных заданий я хочу, чтобы make
появлялся. Ответ jkp, уточненный Крисом Ллойдом, был именно тем, что мне нужно. YMMV.
Вы можете сделать это с помощью утилиты sysctl :
sysctl -n hw.ncpu
Еще проще:
sysctl -n hw.ncpu
Это должна быть кросс-платформа. По крайней мере, для Linux и Mac OS X.
python -c 'import multiprocessing as mp; print(mp.cpu_count())'
Немного медленный, но работает.
Для этого в C вы можете использовать семейство функций 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);
Интересными значениями, используемыми вместо "hw.logicalcpu", который подсчитывает ядра, являются:
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 показывает, что у меня 1 процессор и 4 ядра.
[~] system_profiler SPHardwareDataType Оборудование:
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 не согласен:
[~] sysctl -n hw.logicalcpu 8 [~] sysctl -n hw.physicalcpu 4 [~]
Но sysctl выглядит корректно, так как когда я запускаю программу, которая должна занимать все слоты процессора, я вижу, что эта программа занимает около 800% времени процессора (сверху):
PID COMMAND% CPU
4306 наверх 5.6
4304 java 745,7
4296 locationd 0.0
$ system_profiler | grep 'Total Number Of Cores'
Используйте system_profiler | grep "Cores"
Команда system_profiler | grep "Cores"
.
У меня есть:
MacBook Pro Retina, середина 2012 г.
Процессор: 2,6 ГГц Intel Core i7
user$ system_profiler | grep "Cores"
Total Number of Cores: 4
user$ sysctl -n hw.ncpu
8
Согласно Википедии, (http://en.wikipedia.org/wiki/Intel_Core#Core_i7) нет Core i7 с 8 физическими ядрами, поэтому идея Hyperthreading должна быть именно такой. Игнорируйте sysctl
и используйте значение system_profiler
для точности. Реальный вопрос заключается в том, можете ли вы эффективно запускать приложения с 4 ядрами (длинные задания компиляции?), Не прерывая другие процессы.
Запуск компилятора, параллелизованного с четырьмя ядрами, не оказывает существенного влияния на обычные операции ОС. Так что, возможно, рассматривать его как 8 ядер не так уж и плохо.
Как сказано в комментарии jkp, это не показывает фактическое количество физических ядер. для получения количества физических ядер вы можете использовать следующую команду:
system_profiler SPHardwareDataType
Следующая команда дает вам всю информацию о вашем CPU
$ sysctl -a | sort | grep cpu
РАЗЪЯСНЕНИЕ
Когда этот вопрос был задан, ОП не сказал, что ему требуется количество ЛОГИЧЕСКИХ ядер, а не фактическое количество ядер, поэтому этот ответ логически (без каламбура) отвечает способом получить фактическое количество реальных физических ядер, а не число, которое ОС пытается виртуализировать с помощью гиперпотока voodoo.
ОБНОВЛЕНИЕ ДЛЯ ОБРАБОТКИ ЛОГИСТИКИ В YOSEMITE
Из-за странной ошибки в OS X Yosemite (и, возможно, более новых версиях, таких как предстоящий El Capitan), я сделал маленький модификация. (Старая версия все еще работала отлично, если вы просто игнорируете STDERR, и это все модификация для вас.)
Каждый другой ответ, указанный здесь,
bundle install --jobs 3
, где вы хотите, чтобы вместо 3
быть меньше, чем количество ядер, которые у вас есть, или, по крайней мере, не больше, чем количество ядер)Способ получить только количество ядер, надежно, правильно, достаточно быстро и без дополнительной информации или даже дополнительных символов вокруг ответа:
system_profiler SPHardwareDataType 2> /dev/null | grep 'Total Number of Cores' | cut -d: -f2 | tr -d ' '
На MacBook Pro, работающем с Mavericks, sysctl -a | grep hw.cpu
будет возвращать только некоторые загадочные данные. В разделе machdep.cpu
отображается гораздо более подробная и доступная информация, а именно:
sysctl -a | grep machdep.cpu
В частности, для процессоров с HyperThreading
(HT) вы увидите общее количество подсчитанных CPU (logical_per_package
) в два раза больше, чем количество физического ядра (cores_per_package
).
sysctl -a | grep machdep.cpu | grep per_package
Комментарии для 2 хороших ответов выше:
1) re принятый ответ (и комментарии) jkp: hw.ncpu, по-видимому, устарел в пользу hw.logicalcpu(https://ghc.haskell.org/trac/ghc/ticket/8594)
2) обновление 2014 года Karl Ehr: на моем компьютере (с 2,5 ГГц Intel Core i7) sysctl -a | grep machdep.cpu | grep per_package
возвращает разные номера:
machdep.cpu.logical_per_package: 16
machdep.cpu.cores_per_package: 8
Требуемые значения:
machdep.cpu.core_count: 4
machdep.cpu.thread_count: 8
Какое совпадение:
hw.physicalcpu: 4
hw.logicalcpu: 8
Это можно сделать более переносимым способом:
$ nproc --all
32
Совместимо с macOS и Linux.