Несколько экземпляров программы на многоядерном компьютере - PullRequest
5 голосов
/ 09 августа 2011

Я предполагаю двухъядерную (2 ядра на процессор) машину с 2 процессорами для следующих вопросов;итого 4 "ядра".Поэтому возникли некоторые естественные вопросы:

  1. Предположим, я написал простую последовательную программу и встроил ее, скажем, в Visual Studio .. и дважды запускал одну и ту же программу, скажем, с различными входными данными вкаждый пробег.Будут ли они работать на одном процессоре?Или разные процессоры?Сколько оперативной памяти будет выделено каждому?Будет ли это оперативная память на 1 процессор (2 ядра) или общая оперативная память?Я полагаю, что две программы будут работать на разных процессорах, и каждая из них должна иметь оперативную память в 1 процессор (2 ядра);но я не уверен на 100%.Будет ли поведение в Linux отличаться?

  2. Теперь предположим, что моя программа была написана с использованием параллельного интерфейса распределенной памяти, такого как MPI, и что я запускал ее один раз с двумя процессорами в аргументе np (сказать).Будет ли программа использовать оба процессора (и фактически все 4 ядра)?Это оптимальное значение для аргумента -np?Другими словами, если бы я сделал то же самое с -np 3 или -np 4;правильно ли предположить, что не будет дополнительного преимущества?Опять же, я так думаю, но я не уверен на 100%.Я также предполагаю, что мог бы пойти выше 4 (-np 5, -np 6 и т. Д.).В таких случаях, как процессы конкурируют за память при значениях np> 4?Может ли производительность ухудшиться при np> 4. Думаю, да, и, возможно, это отчасти зависит от размера проблемы, но опять-таки не на 100%.

    Далее, предположим, что я запустил два экземпляра моей параллельной программы, построенной на MPI, оба с -np 2, каждый с, скажем, разными входными данными.Во-первых, это возможно?Я предполагаю, что это так и что каждый из них работает на обоих процессорах?Как синхронизируются две программы и как они последовательно конкурируют за память?Это должно быть по крайней мере частично, основано на порядке запуска программ, предположительно?

  3. Наконец, предположим, что моя программа была написана с использованием параллельного интерфейса с общей памятью, такого как OpenMP, и что я запустилэто один раз.Сколько «потоков» я могу запустить, чтобы в полной мере использовать параллелизм разделяемой памяти - 2 или 4?(так как у меня 2 процессора с 2 ядрами в каждом).Я думаю, это 4;поскольку все 4 ядра являются частью единого блока общей памяти?Это верно?Если ответ 4;имеет ли смысл работать на более чем 4 темы?Я не уверен, что это даже работает (в отличие от MPI, где я считаю, что мы можем сделать -np 5, -np 6 и т. Д.).

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

Ответы [ 3 ]

7 голосов
/ 09 августа 2011

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

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

Для процессов MPI да, ваш параллелизм должен соответствовать количеству ядер (при условии высокой нагрузки на процессор).Если два MPI-процесса работают с -np 2, они просто потребляют все четыре ядра.Увеличивайте что-нибудь, и они начнут бороться.Как объяснено выше, ОЗУ не имеет ничего общего с этим, хотя кэш будет страдать при наличии конкуренции.

Этот «вопрос» слишком длинный, поэтому я сейчас остановлюсь.

3 голосов
/ 09 августа 2011

@ Марсело абсолютно прав, и я бы хотел немного расширить его ответ.

ОС будет определять, где и когда потоки составляют выполнение приложения, в зависимости от того, что еще происходит в системе, и от доступных ресурсов. Каждое приложение будет запускаться в своем собственном процессе, и этот процесс может иметь или сотни потоков . ОС (Windows, Linux, Mac и т. Д.) Будет переключать контекст выполнения процессорных ядер, чтобы гарантировать, что все приложения и службы получат кусок пирога.

Что касается доступа ввода-вывода к таким вещам, как ОЗУ, которое физически контролируется контроллером NorthBridge , который находится на вашей материнской плате. Каждый процесс (не процессор!) Будет иметь выделенный объем ОЗУ, с которым он может работать, который может расширяться или сокращаться в течение срока службы приложения ... это, конечно, ограничено количеством доступных ресурсов в системе, а также стоит отметить, что ОС позаботится об обмене запросами оперативной памяти, помимо физической доступности к диску (т. е. виртуальной оперативной памяти). С другой стороны, вам потребуется координировать доступ к памяти в вашем приложении с помощью критических секций и других механизмов синхронизации потоков.

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

2 голосов
/ 09 августа 2011

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

a) для однопоточной программы они не будут запускаться на одном и том же процессоре (при условии, что он связан с процессором). Вы можете гарантировать это, изменяя близость. в Linux есть вызов sched_setaffinity и пользовательская программа taskset

б) зависит от библиотеки MPI; оборудование зависит от конкретной библиотеки.

в) это зависит от конкретного применения и структуры данных. Для небольших обращений к данным, но большого количества передачи сообщений, вы можете найти ограничение в 1 ЦП для наиболее эффективного шаблона.

...