Почему один поток распределяется между процессорами?

24

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

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

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

Обновить:

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

Маке
источник
3
Даже когда «ничего не выполняется», всегда есть системные потоки, конкурирующие за ЦП. Например, в O / S есть поток для обнуления исправленных страниц памяти, поэтому, когда требуется память, некоторые страницы будут готовы к работе. Когда ваш поток снова начинает выполняться, процессор, на котором вы работали, может использоваться одним из этих потоков. Что должна делать ОС? Ждать или перевести вас на новый процессор? Что бы вы ни делали, в некоторых случаях вы сталкиваетесь с нежелательным поведением.
Тони Ли
Это гумба. SMB, а не LBP. :)
Маке
В своем «ответе» я показал однопоточную программу, которая ведет себя точно так же, как вы описываете, то есть «перемещается от одного к другому несколько раз в секунду, создавая эффект, что она выглядит растянутой».
Эван Росица,

Ответы:

8

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

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

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

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


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

введите описание изображения здесь

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

Nik
источник
Что заставляет вас думать, что «в будущем, благодаря архитектуре Nehalem и NUMA, процессоры с несколькими сокетами также смогут лучше справляться с проблемой доступа». ? На мой взгляд, NUMA делает память еще более локальной и связанной с конкретным процессором, что усугубляет эффект очистки.
Роланд
@RolandPihlakas, с момента получения этого ответа прошло некоторое время, но, глядя на статью об arstechnica и на эти моменты, я думаю, что я учитывал способность новых платформ иметь лучшую связь с памятью и программное обеспечение, позволяющее использовать это преимущество (по сравнению с отсутствием этой опции при несколько конфигураций сокетов в то время, т. е. до Nehalem).
Nik
6

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

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

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

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

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

wierob
источник
3
Во избежание этой проблемы планировщик Windows afaik отлично справляется с поддержкой потоков на одном процессоре / ядре.
Пакси
@ Pär: Кажется, моя ветка работает на каждом ядре.
Мак
Да, это, вероятно, операционные процессы ОС, которые наталкивают мою нить вокруг. Как принять два ответа? :)
Macke
@ PärBjörklund из моего опыта, по крайней мере, Windows XP не делает. Я думаю, что проблема с кэшированием была исправлена ​​в Vista или более поздней
версии
1
«Наличие 4 ядер на 25% означает, что 4 потока выполняются одновременно». Нет, это означает, что один поток выполняется, немного на одном ядре, затем на другом и так далее. Поскольку Диспетчер задач показывает среднее использование, он будет показывать 25% (в четырехъядерной системе, в двухъядерном - 50%) для каждого ядра. Это означает, что ядро ​​полностью использовалось за четверть времени и бездействовало.
Давид Балажич
0

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

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

tsilb
источник
1
Смотрите мои дополнительные разъяснения. Это один поток, работающий на полную мощность, который быстро перемещается, так что с течением времени каждое ядро ​​(вне поля) занято на 25%. (Все остальные процессы / потоки пренебрежимо малы)
Macke
0

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

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

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

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

Давид Балажич
источник
-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 ядрах, поэтому для всего пакета должен быть только один регулятор.
Jäkl
источник
3
Это звучит сомнительно по нескольким причинам. Пожалуйста, предоставьте ссылки на ваши "факты". Во-первых, почему вычислительные ресурсы на 25% на четырех ядрах потребляют меньше энергии, чем 100% на одном? (Я могу согласиться с тем, что тепло распределяется более равномерно, но ...) Кроме того, поток в моем вопросе работает с полным наклоном (100%), поэтому он не будет "запрашивать больше вычислительной мощности", потому что он уже делает как можно больше.
Мак
Ну, это только из моих собственных наблюдений - я был заинтригован IDA и TurboBoost, решил провести несколько тестов. Это было довольно давно, но я пришел к вышеуказанным выводам. Процессор потребляет меньше энергии, так как все ядра работают при более низком напряжении - снижение на 0,1 В экономит около 6-10 Вт потребляемой мощности (если одно ядро ​​загружено на 100%, все ядра работают при более высоком напряжении, независимо от того, находятся ли они в режиме ожидания или не). Это особенно верно в Core2Duo с режимом SLFM. Вы правы в том, что поток, работающий на полном ходу, не запрашивает больше тактов процессора, но есть приложения, которые действительно делают это.
JakL
Не существует такой вещи, как «распространение нити» (нет, даже 5 лет спустя). Существует один поток, выполненный на одном ядре. А потом по другому. И так далее. В каждый момент одно ядро ​​работает на 100%, а остальные работают на холостом ходу. Так что нет сбережений. Тем более, что вы упомянули, что все ядра в любом случае все время находятся на полном напряжении (как вы сказали, они делят напряжение). Также, как уже было сказано, будучи на том же ядре, обеспечивает поток получает всю вычислительную мощность, которая есть. Поскольку это ядро ​​уже используется на 100%, ОС будет планировать другие потоки для других, менее используемых ядер.
Давид Балажич