Если второму виртуальному ядру разрешено вносить свой вклад, когда первое будет зависать, это лучше, чем нет , так что вы получите (по крайней мере) немного дополнительной работы.
Возникает вопрос: когда наличие двух разных потоков приводит к ухудшению работы одного из них? Прогноз ветвления и зависимости между инструкциями не изменятся. Теперь ждем доступа к памяти ... два потока конкурируют за доступ к памяти, как в использовании кэша, так и в пропускной способности.
Если у вас есть некоторые процессоры, работающие с HT, а другие нет, значит ли это, что вы будете назначать определенные потоки одному типу или другому? Я думаю, что нет: ваши программы будут запускать свои потоки на случайных виртуальных ядрах. Так как же помогает разделение конфигурации? Поскольку каждый ЦП имеет свой собственный кеш, единственное влияние - пропускная способность памяти и нагрузка на когерентность кеша.
В общем, вы достигаете точки, когда наличие чего-то большего, что вы могли бы сделать, обходится дороже, чем позволить некоторым исполнительным блокам ЦП простаивать. Это зависит не от количества потоков напрямую, а от того, что эти потоки делают , а также от детальной архитектуры памяти и нюансов производительности различных компонентов.
Там нет простого ответа. Даже с учетом конкретной программы, машина может отличаться от тех людей, которые имеют собственный опыт.
Вы должны попробовать это сами и измерить то, что быстрее всего, с этой конкретной работой на этой конкретной машине. И даже тогда, это может измениться с обновлениями программного обеспечения и изменением использования с течением времени.
Взгляните на 3-й том «Ангер магнум опус» . Если вы внимательно посмотрите на какой-то конкретный процессор, вы можете найти ограничивающие ресурсы среди глубокого конвейера многих шагов, необходимых для выполнения кода. Вам нужно найти случай, когда чрезмерное обязательство заставляет его выполняться медленнее, в отличие от того, чтобы не брать на себя больше работы. В общем, это означало бы какое-то кеширование; и где ресурс распределяется между потоками.
Что означает индикатор ЦП: он сообщает все время, которое не было потрачено на работу в режиме ожидания. Оба логических потока, назначенные ядру, не будут простаивать, даже если фактическая работа, выполненная на одном из них, может быть небольшой. Время, проведенное с конвейером, застряло на несколько циклов, пока результаты не будут готовы, память извлечена, атомарные операции заблокированы и т. Д. Аналогичным образом не следует считать поток отложенным как «не готовый», поэтому он не будет простаивать, и время все еще показывает, как используется. Ожидание в оперативной памяти не будет отображаться в режиме ожидания. Только что-то вроде ввода / вывода блокирует поток и останавливает время зарядки к нему. В общем случае мьютекс операционной системы сделает это, но с появлением многоядерных систем это уже не является надежным, так как «спин-блокировка» не заставит нить вернуться на полку.
Таким образом, показатель процессора 100% не означает, что все идет гладко, если процессор часто застревает в ожидании памяти. Меньшее количество логических ядер, показывающих 90%, вполне может быть выполнено больше, так как оно завершает обработку чисел и теперь ожидает на диске.
Так что не беспокойтесь о показателе процессора. Посмотрите на реальные достижения, только .