Как извлечь максимальную выгоду из Hyper-Threading в .Net

Не уверен, что это вообще возможно на управляемом языке, но возможно ли на самом деле заставить приложение работать лучше при наличии гиперпоточности?

Есть ли что-то конкретное, что можно сделать в коде? , может быть, некоторые функции работают лучше, чем другие в среде HT?

Я знаю, что для получения выгоды от многопоточности все, что нужно, — это создавать новые потоки для выполнения тяжелых задач процессора, но я не уверен, что требуется для HT?


person sharp12345    schedule 09.03.2013    source источник
comment
это очень широкий вопрос, вам лучше задать его на сайтеprogramrs.stackexchange.com.   -  person didierc    schedule 09.03.2013
comment
Вопрос немного сбивает с толку; Вы спрашиваете, есть ли способ оптимизировать программы .NET для работы в среде с гиперпоточностью (в которой есть виртуальные процессоры) по сравнению со средой, в которой так много реальных процессоров? Или ваш вопрос просто в том, как я могу использовать преимущества нескольких ядер? независимо от того, являются ли ядра реальными или виртуальными?   -  person Eric Lippert    schedule 09.03.2013
comment
отредактировал ответ, чтобы устранить некоторую путаницу, надеюсь, я удалил достаточно, чтобы отвечать. @ЭрикЛипперт   -  person sharp12345    schedule 09.03.2013
comment
Задача операционной системы — сделать виртуальные ядра с гиперпоточностью похожими на настоящие ядра. Если вы не пишете операционную систему или другое программное обеспечение, которое зависит от деталей работы процессора, я бы не стал об этом беспокоиться. Обращайтесь с ядрами с гиперпоточностью так же, как с аппаратными ядрами.   -  person Eric Lippert    schedule 09.03.2013


Ответы (1)


Многое зависит от имеющегося у вас аппаратного обеспечения. Прочтите Обратите внимание: использовать Hyper или не использовать Hyper для более глубокого анализа. Точка зрения Славы в ссылке заключается в том, что в HT виртуальные ядра совместно используют кеш, а рабочая нагрузка виртуального ядра может уничтожить кеш «основного» ядра, и, хотя оно может выполнять в лучшем случае около 20% рабочей нагрузки по сравнению с основным ядром , потому что он вытесняет горячий кэш основного ядра, это приводит к остановке основного ядра и в целом приводит к хуже производительности, чем без HT.

Но с тех пор, как статья была опубликована, многое изменилось. значительно лучше.

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

Это довольно наивный взгляд. Вы должны прочитать статьи Рика Вичика о высокопроизводительных программах для Windows ( они применимы и к управляемым приложениям), и вы должны полностью понимать кеши ЦП и почему вы заботитесь.

person Remus Rusanu    schedule 09.03.2013
comment
Итак, вы имеете в виду, что оптимизация запуска пользовательских потоков должна выполняться при работе на машинах HT, поскольку способ параллельного выполнения на физическом ЦП отличается от многоядерного ЦП. Но поскольку для этого не существует специального API, стоит ли это делать? Я знаю, что для BizTalk и SQL Server MS рекомендует отключить HT и предупреждает о неоптимальной производительности в этом режиме, но что вы предлагаете для приложений, которым просто нужно что-то делать в рабочем потоке? - person Marcel N.; 09.03.2013
comment
@marceln: Мое предложение: установите цель производительности. Измерьте, чтобы увидеть, достигли ли вы своей цели. Если вы это сделали, возьмите выходной и отправляйтесь на пляж. Если вы этого не сделали, достаньте профилировщик и оптимизируйте самую медленную вещь. Вероятность того, что ваш рабочий поток работает медленно из-за тонких проблем, связанных с локальностью кэша на процессорах с гиперпоточностью, довольно мала. Можете ли вы описать, какую работу выполняет ваш рабочий поток? - person Eric Lippert; 10.03.2013
comment
@EricLippert: Я согласен, и мне нравится думать, что каждый хороший разработчик действует в таких ситуациях. Но никогда не помешает знать, что происходит на более низких уровнях (и за это спасибо Ремусу). - person Marcel N.; 10.03.2013