Работает ли гиперпоточность?
-
25-10-2019 - |
Вопрос
Я запускаю на своем КОМПЬЮТЕРЕ некоторые довольно ресурсоемкие программы и замечаю, что загрузка моего процессора выглядит довольно странно.Мой компьютер - четырехъядерный i7-870, который предположительно имеет восемь виртуальных ядер.
Я использую библиотеку Task Parallel в .NET 4, поэтому ожидаю, что все ядра будут хорошо использованы, но я получаю подобную информацию от Process Monitor:
Ядра 6 и 8 почти не задеты, и, если не считать кратковременного всплеска, 4 тоже нет.
Это то, чего я должен ожидать?
Решение
По большей части, да, я думаю, что это выглядит разумно.Имейте в виду, что гиперпоточность на самом деле просто подделки два ядра.Каждому физическому ядру предоставлено два интерфейса, поэтому оно может считывать два потока инструкций параллельно.Но они по-прежнему используют одни и те же исполнительные модули.Таким образом, когда одно ядро HT занято, исполнительные блоки заняты, и поэтому его "двойное" ядро сможет выполнять очень мало работы.
Похоже, это то, что вы видите на первых двух ядрах (второе, в частности, делает это очень очевидным)
Помимо этого, вы почти никогда не сможете добиться идеальной загрузки процессора.Иногда ядру просто приходится останавливаться в ожидании памяти.Иногда это выполнение дорогостоящей непроводящей инструкции, эффективно блокирующей исполнительные модули на этом физическом ядре, возможно, на десятки или даже сотни циклов.
И иногда зависимости между инструкциями могут просто означать, что вы не иметь все, что угодно для выполнения одного или нескольких ядер.
Кроме того, вы видите 8 графиков, и у вас всего 4 ядра, так что да, конечно, гиперпоточность работает. ;)
Другие советы
Короче говоря
- да, это работает (конечно)
- составьте его профиль
- YMMV - hyperthreading не является многопоточным и как таковой сильно зависит от типа загрузки команд, насыщенности кэша и т.д.Ничего не зная о своем коде (за исключением того, что на самом деле это C #), вы могли бы поискать коллекции "небольших объектов", которые можно было бы превратить в обычную систему.Массивы структуры (Общий
List<>
также будет использовать массив внутри и оптимизировать для типов элементов struct)
$0.02
Все зависит от реализации вашего алгоритма.TPL будет использовать нужное количество ядер в зависимости от зависимости данных в вашем алгоритме