Как планируются легкие потоки ядром linux в многоядерной многоядерной SMP-системе? - PullRequest
1 голос
/ 27 марта 2012

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

Ответы [ 2 ]

3 голосов
/ 27 марта 2012

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

В зависимости от версии Linux, которую вы используете, могут быть полезны две статьи: эта статья описывает ранние версии 2.6, версии 2.6.22 и эта статья описывает ядра новее, чем 2.6.23 .

0 голосов
/ 28 марта 2012

Различные библиотеки потоков выполняют операции потоков по-разному. В наши дни «стандартом» в Linux является NPTL , который планирует потоки на том же уровне, что и процессы. Это вполне нормально, так как процесс создания в Linux быстр и предназначен для того, чтобы всегда оставаться быстрым.

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

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

В общем, правильная вещь должна просто случиться; но когда ядро ​​не выполняет автоматическую миграцию задач на другие процессоры, вы можете использовать команду taskset(1), чтобы ограничить процессоры, разрешенные для программ, или вы можете изменить свою программу, чтобы использовать функцию pthread_setaffinity_np(3), чтобы запросить миграцию отдельных потоков. (Возможно, это лучше всего подходит для собственных приложений - один из ваших пользователей может не захотеть хотеть вашу программу использовать все доступные ядра. Если вы решите включить вызовы этой функции в вашу программу, убедитесь, что настраивается с помощью файлов конфигурации для обеспечения функциональности, аналогичной программе taskset(1).)

...