Включить Intel Hyperthreading в Java

У меня есть многопоточная программа, работающая на четырехъядерном Intel i7. Когда я выполняю Runtime.getRuntime.availableProcessors(), я получаю 8 и знаю, что на этом процессоре доступна гиперпоточность.

Однако, когда я создаю потоки, мой уровень ЦП составляет 100% (т.е. ненулевой) для 4 потоков, что означает, что 4 потока не используются. Есть ли способ включить гиперпоточность в Java?


person Ryan    schedule 30.07.2014    source источник
comment
HT - это функция процессора, и ОС будет ее использовать. Java не может повлиять на это. Если вы не хотите использовать все 8 процессоров, тогда ваш код должен использовать их все, создавая 8 потоков \ и т. Д.   -  person Sergey Litvinov    schedule 30.07.2014
comment
Гиперпоточность включена в Java, поскольку она использует собственные потоки, поэтому это конфигурация ОС / ЦП. Однако Hyperthreading не дает вам дополнительных ядер, он разрешает таймшер четырех имеющихся у вас ЦП. Если вы выполнили максимум четырех процессоров с четырьмя потоками, то это возможно с включенной или выключенной гиперпоточностью.   -  person Chris K    schedule 30.07.2014
comment
Это работа ОС и / или машины. Если они не включат это, Java не предоставит никаких возможностей. (И если они это сделают, Java должна использовать это автоматически.)   -  person cHao    schedule 30.07.2014
comment
может помочь stackoverflow.com/questions/11738133/   -  person Doon    schedule 30.07.2014
comment
если ваш процессор на 100%, у вас, вероятно, проблема с кодированием.   -  person T McKeown    schedule 30.07.2014
comment
Спасибо всем за прекрасные ответы.   -  person Ryan    schedule 30.07.2014


Ответы (2)


Гиперпоточность обеспечивается тем фактом, что все современные JVM используют собственные потоки, поэтому это параметр конфигурации ОС / ЦП.

Однако Hyperthreading не дает вам дополнительных ядер, он позволяет точно распределить время для четырех имеющихся у вас процессоров. То есть, пока один поток остановлен, скажем, ожидая передачи страницы памяти в кеш, другой поток может подключиться и использовать части ЦП. Он увеличивает размер ядра ЦП примерно на 10% из-за более сложных требований к планированию и не подходит для всех приложений.

Если вы выполнили максимум четырех процессоров с четырьмя потоками, то это возможно с включенной или выключенной гиперпоточностью. Это просто означает, что эти потоки работают в горячем режиме, не сильно блокируя.

Причина, по которой Java сообщает о 8-ядерном ЦП, а не о 4, заключается в том, что ОС сообщает Java, что ЦП имеет 8 ядер. ОС считает, что, поскольку ОС было сказано планировать потоки, как если бы это был 8-ядерный ЦП, это значительно упростило добавление поддержки гиперпоточности в ОС. ОС продолжает управлять потоками, как и раньше, не обращая внимания на большую часть внутренней работы гиперпоточности, и позволяет ЦП управлять низкоуровневым планированием сборки по мере того, как части процессора становятся доступными.

Более подробное обсуждение тестов можно прочитать здесь

person Chris K    schedule 30.07.2014
comment
Мы провели обширный анализ производительности наших собственных Java-приложений. Я был удивлен, обнаружив, что мы получаем лучшую производительность во многих наших jvm, которые работают «в реальном времени» (с высокой пропускной способностью) и чувствительны к потокам с отключенной гиперпоточностью, чем когда она включена. Я подозреваю, что это связано с тем, что java сообщает, что потоки доступны, но в конечном итоге задерживается, потому что операции не могут быть конвейерными, как надеялся отдел маркетинга гиперпоточности. В общем, если вы работаете с приложениями с высокой пропускной способностью, вы можете попробовать проверить, действительно ли гиперпоточность полезна или нет. - person pozcircuitboy; 14.06.2017

Используйте следующую команду

$ lscpu

Выходные данные можно использовать для определения фактического количества ядер и того, включена ли у вас гиперпоточность.

Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                32
On-line CPU(s) list:   0-31
Thread(s) per core:    2
Core(s) per socket:    8
Socket(s):             2
NUMA node(s):          2
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 45
Stepping:              7
CPU MHz:               2399.995
BogoMIPS:              4799.35
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              20480K
NUMA node0 CPU(s):     0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30
NUMA node1 CPU(s):     1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31

Фактический параллелизм, которого можно достичь, будет (количество сокетов) X (ядер на сокет) X (потоков на ядро). Чтобы определить, является ли ваш процессор гиперпоточным или нет, вы можете использовать параметр Threads per core.

person Saurabh    schedule 25.03.2016