2016-09-29 6 views
0

Я только что начал использовать OpenMPI с помощью python. Я выполняю ту же задачу с разными входами (например, 300 из них) по несколько сотен раз. Результаты независимы друг от друга, и каждый процесс печатает окончательный ответ на файл, поэтому нет необходимости в том, чтобы процессы связывались друг с другом. Однако, начиная с новой итерации, все процессы из предыдущего завершены.Согласование MPI заданий и запись в файлы

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

Другие мои вопросы: если один из процессов занимает слишком много времени (слишком долго по сравнению с другими процессами, выполняющими одну и ту же задачу, возможно, 2 или в 3 раза), и из-за нескольких, продолжение выполнения программы сдерживается? Есть ли способ, которым я могу отслеживать, как долго работает процесс, и если он пройдет определенный срок, могу ли я его прекратить?

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

+1

Вы используете MPI. Я понимаю, что такое MPI. Теперь, когда в него входят потоки? Может помочь небольшой пример кода или, по крайней мере, описать, как ваше использование потоковой передачи интегрировано с вашим использованием MPI. –

+0

@JohnZwinck, вероятно, неправильное слово, может быть, вместо этого изменить все потоки? я имею в виду каждый из параллельных исполнений кода. – rdm11

ответ

0

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

Я выполняю ту же задачу с разными входами (например, 300 из них) по несколько сотен раз.

Если вы можете, было бы намного эффективнее запускать N процессов только один раз и дать каждому из них M в начале. Не запускайте N процессов M раз.

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

Тогда, возможно, вам не нужно использовать MPI, на самом деле. Все дело в том, чтобы общаться, поэтому, если вы этого не делаете, это совершенно не нужно.

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

О, хорошо, что это сообщение не так ли?Так, например, ваш шаблон:

N рабочих процессов N входов, ожидающих завершения всех операций, и это повторяется M раз.

Но предположительно каждый вход для каждой из итераций М зависит от предыдущего, так как вы сказали, что предыдущая итерация должна завершиться до начала следующего. Так что это больше общения! Таким образом, ваша модель:

N рабочих процессов N входов, ожидающих завершения всех, затем вычисляется следующий набор из N входов, и это повторяется M раз.

При записи в файл процессы не будут конфликтовать, не так ли? (есть ли встроенный механизм блокировки?)

Право. Если два процесса записываются в отдельные области одного и того же файла, конфликт не возникает. Там может быть штраф за исполнение, но это имеет значение только в том случае, если вы много пишете. Вы также можете открыть файл в режиме «append», и в этом случае любая отдельная запись до нескольких килобайт будет атомарной, что также может работать в некоторых случаях использования. Если вам нужно написать много данных, вам лучше писать отдельный файл из каждого процесса.

Что делать, если один из процессов занимает слишком много времени (слишком долго по сравнению с другими процессами, выполнявшими одну и ту же задачу, возможно, в 2 или 3 раза), а из-за нескольких продолжающееся выполнение программы сдерживается? Есть ли способ, которым я могу отслеживать, как долго работает процесс, и если он пройдет определенный срок, могу ли я его прекратить?

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

+0

спасибо, это именно то, что мне нужно. Еще один вопрос, хотя есть ли внутренние часы в каждом процессе, к которому мы можем получить доступ, или это что-то, что необходимо реализовать? Если «слишком долго» определяется другими выполняемыми процессами (так будет ли процесс с рангом 0 отслеживать это значение?) Могу ли я убить конкретный поток от другого? – rdm11

+0

@ rdm11: Я решил, что вы просто используете стандартный таймер, как вы бы использовали без MPI, в каждом отдельном процессе. Если вам нужна дополнительная помощь, вы должны отправить новый вопрос. –

0

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

Рассмотрим этот сценарий

«А Записывает 500 байт со смещением 0. B записывает 500 байт по смещению 1000»

Эти записи может произойти одновременно - но многое зависит от основной файловой системы. GPFS и Lust имеют протоколы блокировки, которые работают с блоками (GPFS) или страницами (Luster). Оба A и B попытаются получить блокировку. Один будет работать и действовать немедленно, а другой будет действовать только после завершения A.