Как ядра, процессы и потоки SMP работают точно вместе? - PullRequest
51 голосов
/ 07 июня 2010

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

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

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

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

Ответы [ 5 ]

48 голосов
/ 07 июня 2010

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

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

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

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

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

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

11 голосов
/ 07 июня 2010

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

9 голосов
/ 20 июля 2013

@ BjoernD, ты упомянул это ..

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

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

6 голосов
/ 07 июня 2010

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

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

0 голосов
/ 23 июня 2016

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...