Здесь много, поэтому я приведу некоторые части вашего вопроса и сделаю шаг за шагом.
Я выполняю ту же задачу с разными входами (например, 300 из них) по несколько сотен раз.
Если вы можете, было бы намного эффективнее запускать N процессов только один раз и дать каждому из них M в начале. Не запускайте N процессов M раз.
Результаты независимы друг от друга, и каждый процесс печатает окончательный ответ на файл, поэтому нет необходимости в том, чтобы процессы связывались друг с другом.
Тогда, возможно, вам не нужно использовать MPI, на самом деле. Все дело в том, чтобы общаться, поэтому, если вы этого не делаете, это совершенно не нужно.
Однако, для начала новой итерации требуется, чтобы все процессы из предыдущего были завершены.
О, хорошо, что это сообщение не так ли?Так, например, ваш шаблон:
N рабочих процессов N входов, ожидающих завершения всех операций, и это повторяется M раз.
Но предположительно каждый вход для каждой из итераций М зависит от предыдущего, так как вы сказали, что предыдущая итерация должна завершиться до начала следующего. Так что это больше общения! Таким образом, ваша модель:
N рабочих процессов N входов, ожидающих завершения всех, затем вычисляется следующий набор из N входов, и это повторяется M раз.
При записи в файл процессы не будут конфликтовать, не так ли? (есть ли встроенный механизм блокировки?)
Право. Если два процесса записываются в отдельные области одного и того же файла, конфликт не возникает. Там может быть штраф за исполнение, но это имеет значение только в том случае, если вы много пишете. Вы также можете открыть файл в режиме «append», и в этом случае любая отдельная запись до нескольких килобайт будет атомарной, что также может работать в некоторых случаях использования. Если вам нужно написать много данных, вам лучше писать отдельный файл из каждого процесса.
Что делать, если один из процессов занимает слишком много времени (слишком долго по сравнению с другими процессами, выполнявшими одну и ту же задачу, возможно, в 2 или 3 раза), а из-за нескольких продолжающееся выполнение программы сдерживается? Есть ли способ, которым я могу отслеживать, как долго работает процесс, и если он пройдет определенный срок, могу ли я его прекратить?
Вы не должны этого делать, потому что тот же ввод будет обрабатываться медленно другим процессом позже. Если вы не думаете, что может быть что-то не так с входом, в этом случае каждый процесс должен сохранять свой собственный внутренний таймер и сдаваться, если он превышает заданный предел.
Вы используете MPI. Я понимаю, что такое MPI. Теперь, когда в него входят потоки? Может помочь небольшой пример кода или, по крайней мере, описать, как ваше использование потоковой передачи интегрировано с вашим использованием MPI. –
@JohnZwinck, вероятно, неправильное слово, может быть, вместо этого изменить все потоки? я имею в виду каждый из параллельных исполнений кода. – rdm11