Работает ли гиперпоточность?


Я запускаю некоторые довольно интенсивные процессоры на своем ПК, и замечаю, что моя загрузка процессора выглядит довольно странно. Мой компьютер-четырехъядерный i7-870, который предположительно имеет восемь виртуальных ядер.
Я использую параллельную библиотеку задач в .NET 4, поэтому ожидаю, что все ядра будут хорошо использованы, но получаю такую информацию от Process Monitor:

использование процессора

Ядра 6 и 8 почти не соприкасаются, и, если не считать короткого всплеска, 4 тоже не соприкасается.
Это то, чего я должен был ожидать?
3 2

3 ответа:

По большей части, да, я думаю, что это выглядит разумно. Имейте в виду, что hyperthreading на самом деле просто подделывает два ядра. Каждое физическое ядро имеет два интерфейса, поэтому оно может читать два потока инструкций параллельно. Но они по-прежнему используют одни и те же исполнительные единицы. Поэтому, когда одно ядро HT занято, исполнительные блоки заняты, и поэтому его" двойник " ядро будет в состоянии сделать очень мало работы.

Похоже, это то, что вы видите на первых двух ядрах (в частности, на втором делает это очень очевидным)

Кроме этого, вы почти никогда не сможете получить идеальную загрузку процессора. Иногда ядро просто должно задержаться в ожидании памяти. Иногда он выполняет дорогостоящую непроверенную инструкцию, эффективно блокируя исполнительные блоки на этом физическом ядре, возможно, на десятки или даже сотни циклов.

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

Кроме того, вы видите 8 графиков, и у вас есть только 4 ядра, так что Да, конечно, hyperthreading работает. ;)

Короче говоря

  1. Да, это работает (конечно)
  2. , что
  3. YMMV - hyperthreading не является многопоточным и поэтому сильно зависит от типа загрузки инструкций и насыщенности кэша и т. д. Не зная ничего о своем коде (кроме того, что это C#, на самом деле), вы можете искать коллекции "маленьких объектов", которые можно было бы сделать в прямую систему.Массивы структур (универсальный List<> также будет использовать массив внутренне и оптимизировать для элемента struct типы)

$0.02

Все зависит от реализации вашего алгоритма. TPL будет использовать соответствующее количество ядер в зависимости от зависимости данных в вашем алгоритме