Работает ли гиперпоточность? - PullRequest
2 голосов
/ 10 июня 2011

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

CPU usage

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

Ответы [ 3 ]

3 голосов
/ 10 июня 2011

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

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

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

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

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

0 голосов
/ 10 июня 2011

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

0 голосов
/ 10 июня 2011

Короче

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

$ 0,02

...