Как узнать количество * логических * ядер в Mac OS X? - PullRequest
354 голосов
/ 11 ноября 2009

Как узнать из командной строки, сколько ядер на машине, когда вы работаете в Mac OS X? В Linux я использую:

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

Это не идеально, но это близко. Это предназначено для подачи к make, поэтому оно дает результат на 1 больше, чем фактическое число. И я знаю, что приведенный выше код может быть написан более плотно в Perl или может быть написан с использованием grep, wc и cut, но я решил, что вышеупомянутое было хорошим компромиссом между краткостью и удобочитаемостью.

ОЧЕНЬ ПОЗДНЕЕ РЕДАКТИРОВАНИЕ: Просто чтобы уточнить: я спрашиваю, сколько доступно логических ядер, потому что это соответствует количеству одновременных заданий, которые я хочу создать make. Ответ jkp, уточненный Крисом Ллойдом, был точно , что мне было нужно. YMMV.

Ответы [ 12 ]

1 голос
/ 08 января 2014

ПОЯСНЕНИЯ

Когда этот вопрос был задан, ОП не сказал, что ему нужно количество ЛОГИЧЕСКИХ ядер, а не фактическое ядер, поэтому этот ответ логически (не каламбур) отвечает способом, позволяющим получить фактическое количество реальных физических ядер, а не число, которое ОС пытается виртуализировать с помощью гиперпоточности voodoo.

ОБНОВЛЕНИЕ ДЛЯ ОБРАБОТКИ FLAW В YOSEMITE

Из-за странной ошибки в OS X Yosemite (и, возможно, более новых версиях, таких как предстоящая El Capitan), я сделал небольшую модификацию. (Старая версия все еще работала на отлично, если вы просто игнорируете STDERR, и это все, что делает для вас модификация.)


Любой другой ответ, приведенный здесь, либо

  1. дает неверную информацию
  2. не дает информации, из-за ошибки в реализации команды
  3. работает невероятно медленно (занимает большую часть минуты , чтобы завершить), или
  4. дает слишком много данных и, следовательно, может быть полезно для интерактивного использования, но бесполезно, если вы хотите использовать данные программно (например, в качестве ввода для команды, такой как bundle install --jobs 3, где вы хотите вместо числа указать *). 1040 * - это на единицу меньше количества ядер, которое у вас есть, или, по крайней мере, не больше количества ядер)

Способ получить только количество ядер, надежно, правильно, достаточно быстро, без дополнительной информации или даже дополнительных символов вокруг ответа, таков:

system_profiler SPHardwareDataType 2> /dev/null | grep 'Total Number of Cores' | cut -d: -f2 | tr -d ' '
0 голосов
/ 23 января 2015

Комментарии к 2 хорошим ответам выше:

1) повторный принятый ответ (и комментарии) от jkp: hw.ncpu явно устарел в пользу hw.logicalcpu (https://ghc.haskell.org/trac/ghc/ticket/8594)

)

2) обновление 2014 года от Карла Эра: на моем компьютере (с процессором Intel Core i7 2,5 ГГц) 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...