Вопрос

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

CPU usage

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

Это было полезно?

Решение

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

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

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

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

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

Другие советы

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

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

$0.02

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top