Как ядра ЦП распределяются по каждому ядру при расчете распараллеливания?
Просто хочу убедиться, что я правильно понимаю, прежде чем задавать вопросы. Я видел, как некоторые люди говорили, что некоторые функции в Mathematica будут автоматически использовать многоядерные процессоры (я не имею в виду те, которые мы распараллеливаем, а имею в виду такие, как NIntegrate
), поэтому я думаю, что если у меня будет 2 ядра, это будет быстрее, чем одно ядро. Итак, мои вопросы: есть ли у меня такой код:ParallelTable[NIntegrate[x, {x, 1, 3}], {loop, 1, 3}]
Думаю, три ядра запустятся. Если у меня 4 ядра, как эти четыре ядра распределяются по каждому ядру? (Поскольку я думаю, что каждое ядро может использовать многоядерность на основе свойства интеграции функций)
Ответы
Добро пожаловать, noo-b, m.se - отличное сообщество для бесконечного изучения M!
Я думаю, у вас есть несколько ложных предположений:
Во-первых, даже однопоточные операции могут выполняться через несколько ядер. Хорошая операционная система пытается этого избежать, но каждые столько-то секунд она может переключаться на другое ядро или может разделять нагрузку на несколько ядер - хотя последнее обычно не в течение длительного времени.
Во-вторых, вы не можете предположить, что NIntegrate всегда будет распараллеливать все входные данные, и, в частности, вы не можете предположить, что NIntegrate будет распараллеливать все время вычислений. Он может распараллеливаться только для инициализации или в конце, или при выборе промежуточных задач. Например,
Do[Do[NIntegrate[x,{x,1,3}],{3}],{100000}]
если вы посмотрите на использование ядра (а не на использование процессов, как в простом диспетчере задач) - если вы работаете в Linux, вы можете запустить топ и нажать 1 - вы увидите, что это тратит 99% времени на одно ядро. Он может переключить ядро через некоторое время, но тогда вы увидите 99% для этого ядра. Так что я вообще не вижу потоковой передачи NIntegrate на нескольких ядрах, по крайней мере, не все время (возможно, на доли секунды). Это может быть разным для разных входов NIntegrate, но этот простой пример показывает, что NIntegrate не всегда распараллеливается и не на протяжении всего времени вычисления.
С фреймворком M parallelism это не меняется, это действительно вопрос операционной системы. С ParallelTable (и его братьями) вы просто предоставляете задачи обработки из большего количества процессов, и то, как операционные системы распределяют их по ядрам, полностью зависит от них. Таким образом, вы не можете "отказаться" от назначения ядер из понимания параллельных процессов.
что-то вроде касательной:
В Scala, Java или C # (или многих других языках) вы можете планировать задачи на уровне потока. Но даже в этом случае составители должны планировать проступки до ядер. С Java vmstat у вас есть прекрасная визуализация потоков (горизонтальные полосы, которые со временем растут, по одной на поток), я думаю, что вас действительно интересует, как все работает в потоках, не обязательно то, как потоки назначаются ядрам . С учетом сказанного, потоки - это концепция программного обеспечения, а не концепция оборудования, ядро не знает, что такое поток. Но я думаю, что анализ потоков даст вам больше информации для понимания параллелизма как распределения ядер, а переключение ядер и процент рабочей нагрузки для каждого ядра полностью зависит от его работы.
Есть некоторые функции, которые автоматически используют несколько ядер. Сколько ядер они используют, определяется некоторыми настройками в SystemOptions["ParallelOptions"]
.
Если вы используете такие функции в подъядрах, они будут использовать только одно ядро. Вы можете убедиться в этом, посмотрев на ParallelEvaluate@SystemOptions["ParallelOptions"]
. Обратите внимание, что все счетчики потоков установлены в 1 на подъядрах.
Как правило, явное распараллеливание (например, ParallelTable
) не так эффективно, как встроенное распараллеливание некоторых функций. Таким образом, если ваше узкое место - это функция, которая уже работает параллельно, то реализация дополнительного распараллеливания с ParallelTable
или связанными функциями замедлит ее работу (или, по крайней мере, она замедлит ее во всех проверенных мной случаях).