Cores vs Threads: Сколько потоков я должен запустить на этом компьютере?

41

Сколько потоков я должен запустить на этой машине?

Мой lscpuговорит, что есть 96 ядер. Это физические ядра? Какой максимальный и оптимальный поток я могу запустить на этой машине?

https://stackoverflow.com/a/10670440/610569 показывают, что я могу запустить более 20 потоков на ядро. Все хорошо? Это оптимально?

alvas@server:~$ lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                96
On-line CPU(s) list:   0-95
Thread(s) per core:    2
Core(s) per socket:    12
Socket(s):             4
NUMA node(s):          4
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 62
Model name:            Intel(R) Xeon(R) CPU E5-4657L v2 @ 2.40GHz
Stepping:              4
CPU MHz:               2700.000
CPU max MHz:           2900.0000
CPU min MHz:           1200.0000
BogoMIPS:              4801.91
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              30720K
NUMA node0 CPU(s):     0,4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92
NUMA node1 CPU(s):     1,5,9,13,17,21,25,29,33,37,41,45,49,53,57,61,65,69,73,77,81,85,89,93
NUMA node2 CPU(s):     2,6,10,14,18,22,26,30,34,38,42,46,50,54,58,62,66,70,74,78,82,86,90,94
NUMA node3 CPU(s):     3,7,11,15,19,23,27,31,35,39,43,47,51,55,59,63,67,71,75,79,83,87,91,95

Прошу прощения за мое заурядность в ядрах / темах

Alvas
источник

Ответы:

52

Это то, что вы хотите знать

Thread(s) per core:    2
Core(s) per socket:    12
Socket(s):             4

У вас есть 4 сокета ЦП, каждый ЦП может иметь до 12 ядер, а каждое ядро ​​может иметь два потока.

Максимальное количество потоков составляет 4 ЦП x 12 ядер x 2 потока на ядро, поэтому 12 x 4 x 2 равно 96. Следовательно, максимальное число потоков равно 96, а максимальное число ядер равно 48.

Что лучше ?

Это зависит от того, что вы хотите сделать, чем больше потоков, тем меньше частота (т. Е. 3 ГГц становится разделенным на две части), но лучше многозадачность (больше потоков) и использование полных ядер (без гиперпоточности) лучше для задач с высокой загрузкой ЦП ( т.е. игры).

Надеюсь, это поможет вам.

Марк Кирби
источник
3
«больше потоков означает меньшую частоту», это утверждение очень неправильно. Даже с гиперпоточностью один процесс может полностью использовать процессор. Гиперпоточность может использовать конвейеры инструкций и регистры, которые в противном случае были бы бездействующими для параллельного выполнения некоторых операций из разных процессов / потоков, что в некоторых случаях увеличивает максимальную пропускную способность процессора. Повышение производительности очень сильно зависит от приложения / конфигурации. После P4 нет документированных
потерь
2
Я не считаю это утверждение очень неправильным. Если вы запускаете два процесса на одном ядре, для каждого процесса доступна меньшая частота по сравнению с запуском каждого процесса на его собственном ядре. Это очень простое и простое утверждение, но OP никогда не запрашивал никаких подробностей о гиперпоточности или о том, как она работает. Хотя вы правы, гиперпоточность прошла долгий путь, и с 48 ядрами я уверен, что они не захотят его отключать.
Марк Кирби
2
@NGRhodes: Intel HT достаточно мелкозернистый, чтобы перекрывать неупорядоченное выполнение между двумя потоками. В этом и заключается весь смысл HT, заключающийся в том, чтобы показать больше параллелизма на уровне инструкций ядру не по порядку. (т.е. поддержание подачи этих исполнительных блоков даже в том случае, если один поток восстанавливается после неверного прогнозирования ветки или ожидания при пропадании кэша.) Пропускная способность внешней проблемы делится на 50/50 (кроме случаев, когда один поток останавливается), поэтому в зависимости от того, какой тип Узкое место, с которым сталкивается ваш код, HT может дать вам почти удвоенную пропускную способность или почти лишнюю пропускную способность. (Как 15% для кодирования видео x264.)
Питер Кордес
1
Смотрите agner.org/optimize для деталей микроархитектуры.
Питер Кордес
1

Каждый поток ядра процессора (аппаратный поток) - одно из ваших 96 ядер эффективно может обрабатывать 16 потоков (программный поток, например, C ++ thread.h) в большинстве случаев, по моему теоретическому мнению.

Петр Ленарчик
источник
1
с чего ты взял "эффективно справиться с 16 потоками"? Выход говорит «темы (ы) на ядро: 2»
committedandroider
0

Вы узнаете, сколько потоков вы можете запустить на своем компьютере, запустив команду htop или ps, которая возвращает число процессов на вашем компьютере.

Вы можете использовать справочную страницу о команде 'ps'.

man ps

Если вы хотите рассчитать количество всех пользователей процесса, вы можете использовать одну из следующих команд:

  1. ps -aux| wc -l
  2. ps -eLf | wc -l

Расчет количества пользовательских процессов:

  1. ps --User root | wc -l

Также вы можете использовать «htop» [Ссылка] :

Установка в Ubuntu или Debian:

sudo apt-get install htop

Установка на Redhat или CentOS:

yum install htop
dnf install htop      [On Fedora 22+ releases]

Если вы хотите скомпилировать htop из исходного кода, вы найдете его здесь .

Саид Захедян Абруди
источник