Подтвердить что ты не робот

Как ядра, процессы и потоки SMP работают вместе?

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

Теперь, на многоядерном процессоре:

  • Поддерживаются ли ядра в каждом процессе или могут ли ядра работать отдельно в разных процессах в определенный момент времени? Например, у вас есть программа A, которая запускает два потока. Может ли двухъядерный процессор запускать оба потока этой программы? Я думаю, что ответ должен быть да, если мы используем что-то вроде OpenMP. Но в то время как ядра работают в этом процессе OpenMP, может ли один из ядер просто переключиться на другой процесс?

  • Для программ, созданных для одного ядра, при запуске на 100%, почему используется загрузка ЦП каждого ядра? (например, двухъядерный процессор 80% и 20%. Процент использования всех ядер всегда может составлять до 100% для этого случая.) Являются ли ядра способными помогать друг другу, управляя каждым потоком каждого процесса, в некотором смысле

4b9b3361

Ответ 1

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

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

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

Теперь к вашим конкретным вопросам:

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

2) Даже если вы используете однопоточное приложение на многоядерном процессоре, вы заметите, что другие процессоры тоже работают. Это происходит: а) от ОС, выполняющей свою работу, и б) из-за того, что ваше приложение никогда не запускается в одиночку - каждая работающая система состоит из целой группы одновременно выполняющих задачи. Проверьте диспетчер задач Windows (или ps/top на Linux), чтобы проверить, что работает.

Ответ 2

Обратите внимание также, что ОС не заботится о том, из какого процесса происходят потоки. Как правило, они планируют потоки для процессоров/ядер независимо от того, из какого процесса происходит поток. Это может привести к тому, что четыре потока из одного процесса будут выполняться одновременно, так же, как один поток из четырех процессов, работающих одновременно.

Ответ 3

@BjoernD, вы упомянули, что..

.. Если ваше приложение состоит только из одного потока, то ваш целая многопроцессорная система не поможет вам, поскольку она все равно будет использовать один процессор для вашего приложения...

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

Ответ 4

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

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

Ответ 5

Если есть одно приложение потока, в котором сказано 10 потоков, изначально он запускается на том же процессоре/ядре. Через некоторое время несколько потоков будут распределены по другим ядрам/процессорам из-за балансировки нагрузки в Linux. Если есть несколько таких приложений потока, я думаю, что все потоки приложений в основном выполняются на одном и том же ядре/процессоре, так как locals/globals потоков легко доступны в кеше l1/l2 ядра, в котором они выполнялись. они из ядра занимают много времени, чем время их выполнения. Если потоки должны выполняться в другом ядре. Я думаю, что нужно предоставить информацию о близости к потоку.