Используют ли несколько подпроцессов несколько ядер?

Используют ли несколько подпроцессов несколько ядер?

У меня есть вопрос, и по сути он касается изучения некоторых ленивых способов использования всех ядер на компьютере.

Допустим, у меня есть программа «./theprogram», которая работает с набором данных D, является «невероятно параллельной» и принимает аргумент командной строки j, который выполняет программу на подмножестве ее набора данных, определяемом j.

Затем предположим, что в моем терминале я запускаю команды

./theprogram j1 &
./theprogram j2 &
./theprogram j3 &
. etc
. etc
. etc
./theprgoram jfinal &

Теперь я породил подпроцессы для j1, j2, ... jfinal

Мой вопрос: предположим, что у меня современная система Unix (скажем, последняя версия Mac Os X, работающая на многоядерном чипе)

Тогда процессы будут распределены по всем ядрам отдельно? Т.е. я использую ВСЕ свои ядра?

решение1

Теоретически да.

Операционная система планирует задачи на неиспользуемые ядра ЦП. Она знает, когда ядро ​​не используется, потому что она просто отменила планирование задачи с него.

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

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

Если никаких других процессов не требуется запускать, ваш процесс все равно будет находиться в верхней части списка и получит еще одну попытку.

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

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

Handbrake — это видеокодер на базе CPU (недавно также с поддержкой GPU), который может использовать столько ядер CPU, сколько вам нужно, и таким образом достигать высокого уровня повышения скорости. Многие видеокодеры могут эффективно использовать несколько ядер. x.264 и другие кодеры также поддерживают несколько потоков.

7-Zip — это программа сжатия, которая также может использовать несколько потоков в своем алгоритме LZMA2 для ускорения сжатия. Создание словаря сжатия — это разумный общий процесс, и как только у вас есть словарь, фактическое сжатие становится «тривиально» параллелизуемым.

решение2

Для многопроцессорной обработки необходимо выбрать раздел кода, который соответствует:

  1. Нельзя полагаться на предыдущие результаты
  2. Не требует выполнения в определенном порядке.
  3. Не вернет ничего, к чему позже понадобится доступ в коде.

Итак, из того, что я слышу, следует, что вы сможете использовать несколько ядер.

Связанный контент