24

Мне просто любопытно, почему планировщик постоянно перемещает приложение между процессорами, а не держит его на одном. Кажется немного глупым иметь 4 ядра на 25%, а не одно на 100%.

Это связано с теплом или как-то более эффективно? Другие ОС делают это по-другому?

Инсайты или ссылки на подробные материалы были бы хорошими. (Не могу найти много себя.)

Обновить:

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

5 ответов5

8

Я думаю, что wierob описал этот вопрос довольно хорошо.
Вот старая статья, в которой обсуждаются настройки соответствия processor affinity с четырехъядерным процессором QX6800.
(ссылка указывает на вторую страницу этой статьи).

Если вы не навязываете привязку процессов к ядру, вы теряете производительность?

  • В то время как планировщик Windows должен решить такую близость, чтобы избежать переполнения кешами,
    сама конструкция процессора тоже учитывает такие вещи.
  • Четырехъядерный процессор Intel QX6800 (так как я упоминал его ранее в этом ответе)
    имеет кэш-память L3 уровня объемом 8 МБ, разделенную на четыре ядра.

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


В дальнейшем, с архитектурой Nehalem и NUMA,
Процессоры через несколько сокетов также смогут лучше справляться с трэшем.
Вот краткое изображение со страницы ArsTechnica на NUMA.

Если вас интересуют Nehalem и i7 , у меня есть еще несколько ссылок на этот ответ.

6

Планировщик просто выполняет следующий поток, который готов к выполнению на "свободном" ядре / процессоре.

Вы можете назначить процесс определенному процессору через диспетчер задач Windows.

Наличие 4 ядер на 25% означает, что 4 потока выполняются одновременно. Принимая во внимание, что одно ядро в x% означает, что выполняется только один поток. Так что первый в некоторых случаях более эффективен.

Но во время его выполнения кэш ЦП заполняется данными, к которым обращается поток. Таким образом, если поток исполняется на другом процессоре, он будет испытывать больше ошибок в кэше, что является дорогостоящим, поскольку данные не находятся в кэше этого процессора.

Что делает ваша нить? Если поток "спит" в течение очень короткого времени, ядро, на котором он выполнялся, может быть занято другой угрозой, и, таким образом, ваш поток выполняется на следующем доступном ядре. Что произойдет, если вы укажете только одно ядро, которое будет использоваться вашим процессом (например, диспетчер задач)?

1

ОС переносит поток между ядрами процессора (быстро, несколько раз в секунду). Более эффективно запускать его на одном и том же ядре все время. Это может быть реализовано с помощью пункта контекстного меню "Установить сходство" в диспетчере задач.

Обратите внимание, что обычно (типичное домашнее использование) разница находится в диапазоне нескольких процентов.

«4 ядра с 25% -ным использованием» означает, что, поскольку Диспетчер задач показывает среднее использование, каждое ядро было полностью использовано за четверть времени и оставалось свободным в остальное время.

Описание для Windows, но оно похоже на другие операционные системы.

0

Это не. Один поток может работать только на одном процессоре. Однако некоторые процессы имеют несколько потоков, которые могут быть распределены.

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

-1

Если кто-то все еще читает это, я тоже это заметил и выполнил немало тестов, чтобы убедиться, что это не случайность. Оказывается, это не так! Я считаю, что распространение одного потока на все ядра более эффективно по нескольким причинам:

  1. Распределение одного потока по всем ядрам позволяет снизить энергопотребление. Большинство процессоров понижают свои частоты и, что более важно, напряжение в соответствии с нагрузкой, поэтому, например, Core 2 Quad будет потреблять намного меньше энергии и производить меньше тепла, распределяя один поток по всем 4 ядрам, а не используя одно ядро (что привести к увеличению напряжения на ВСЕХ ядрах, так как есть только один регулятор напряжения * - это довольно неэффективно).
  2. Это гарантирует, что поток всегда работает с максимальной / постоянной скоростью. Если поток внезапно запросит больше вычислительной мощности, одно ядро может стать перегруженным, и выполнение будет задержано. Распределяя его по ядрам, любой внезапный всплеск будет обрабатываться плавно, без задержек и задержек.

Кроме того, из-за двух вышеупомянутых наблюдений я пришел к выводу, что Turbo Boost и IDA неэффективны. Они могут быть полезны в старых операционных системах, но Linux и Windows 7 довольно эффективно распределяют все по всем ядрам. Итак, Core 2 Quad Q9100 @ 2,26 ГГц будет почти (всегда есть исключения :-) всегда будет быстрее, чем Core 2 Duo X9100 @ 3,06 ГГц, и я редко видел, чтобы он использовал IDA (в основном предшественник Turbo Boost, увеличивает частоту на одном или двух ядрах только для однопоточных приложений).

  • Core 2 Quad имеет два тактовых домена благодаря тому, что есть два физических кристалла, поэтому два ядра могут работать на полной частоте, а два - на самой низкой частоте. Я не знаю, есть ли два регулятора напряжения - я заметил, что напряжение одинаково на всех 4 ядрах, поэтому для всего пакета должен быть только один регулятор.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .