Гиперпоточность заставляет мой код работать медленнее?

Некоторый многопоточный код, который я только что написал, кажется, работает медленнее в многопоточных процессорах - то есть отключение гиперпоточности делает его более быстрым. Это нормально?

1 ответ

Это полностью зависит от варианта использования. Субъективный термин, как обычно, имеет много свободы! Есть случаи, когда Hyper-Threading (HT) имеет смысл, и случаи, когда это влияет на производительность.

Один из таких случаев снижения производительности - для приложений, интенсивно использующих инструкции AVX. Инструкции AVX выполняются в модуле векторной обработки (VPU), из которых по одному на ядро ​​в процессорах Intel Xeon. Дополнительные потоки будут блокироваться при попытке доступа к VPU, если он недоступен, что не приведет к улучшению производительности при использовании HT.

Если вы говорите, 4 ядра с HT, что позволяет вам запускать 8 потоков, вы фактически сможете запускать только 4 инструкции VPU за раз - поэтому остальные 4 потока будут заблокированы по мере их завершения. Дополнительные накладные расходы на блокировку и планирование обычно обеспечивают более низкую пропускную способность, чем если бы вы работали с 4 потоками на 4 ядрах с отключенным HT.

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

Для более общих случаев использования, таких как универсальный сервер, обрабатывающий много типов рабочих нагрузок, преимущество HT, выполняющего дополнительные потоки в одном ядре, обычно повышает производительность.

Другие вопросы по тегам