Возможно ли написать с несколькими процессорами в одном файле, в конце файла, по порядку?
Я имею 2
процессоры (это пример), и я хочу эти 2
процессоры для записи в файл. Я хочу, чтобы они писали в конце файла, но не в смешанном порядке, например:
[file content]
proc0
proc1
proc0
proc1
proc0
proc1
(and so on..)
Я хотел бы заставить их писать по такой схеме:
[file content]
proc0
proc0
proc0
proc1
proc1
proc1
(and so on..)
Является ли это возможным? Если да, то какие настройки использовать?
3 ответа
Последовательность, в которой ваши процессы имеют готовые отчеты, по сути, заранее неизвестна. Даже повторные прогоны одной и той же программы MPI будут показывать различия в порядке вывода. Поэтому что-то где-то должно будет наложить порядок записи в файл.
Очень распространенная модель, о которой Уэсли уже упоминал, состоит в том, чтобы все процессы отправляли свои результаты одному процессу, часто процессу 0, и позволяли ему заниматься записью в файл. Этот мастер записи может сортировать выходные данные перед записью, но это создает пару проблем: выделение места для хранения выходных данных перед записью и, что более сложно, определение, когда коллекция выходных записей может быть отсортирована и записана в файл, и выходные буферы могут быть использованы повторно. Как долго мастер-писатель ждет и как он узнает, что процесс все еще работает?
Поэтому обычно мастер-писатель записывает выходные данные по мере их получения, а другая программа упорядочивает выходной файл по желанию после завершения параллельной программы. Вы могли бы прикрепить это к вашей параллельной программе в качестве шага после mpi_finalize
или вы можете использовать совершенно отдельную программу (например, sort
на машине Linux). Конечно, чтобы это работало, каждая выходная запись должна содержать некоторую информацию о последовательности, по которой нужно сортировать.
Другой распространенный шаблон - иметь только один процесс, который вообще выполняет какую-либо запись, то есть ни один из других процессов вообще не производит никакого вывода. Это полностью исключает недетерминированность последовательности написания.
Другой шаблон, менее распространенный отчасти потому, что его сложнее реализовать, а отчасти потому, что он зависит от базовых механизмов, которые не всегда доступны, заключается в использовании mpi io
, С mpi io
несколько процессов могут записывать в разные части файла, как будто одновременно. Чтобы на самом деле писать одновременно, программа должна выполняться на оборудовании, сети и операционной системе, которая поддерживает параллельный ввод / вывод. Это может быть сложно реализовать даже с правильной платформой, особенно, когда объем результатов от процессов является неопределенным.
По моему опыту здесь, на SO, люди, задающие такие вопросы, как ваш, вероятно, находятся на слишком ранней стадии в своем опыте MPI, чтобы заниматься параллельным вводом-выводом, даже если у них есть доступ к необходимому оборудованию.
Я не согласен с High Performance Mark. MPI-IO не так сложен в 2014 году (если у вас есть доступ к любой файловой системе, кроме NFS - устанавливайте PVFS, если вам нужна дешевая простая параллельная файловая система).
Если вы знаете, сколько данных имеет каждый процесс, вы можете использовать MPI_SCAN для эффективного вычисления того, сколько данных было записано "более ранними" процессами, а затем использовать MPI_FILE_WRITE_AT_ALL для эффективного ввода-вывода. Вот один из способов сделать это:
incr = (count*datatype_size);
MPI_Scan(&incr, &new_offset, 1, MPI_LONG_LONG_INT,
MPI_SUM, MPI_COMM_WORLD);
MPI_File_write_at_all(mpi_fh, new_offset, buf, count,
datatype, status)
Ответ на ваш вопрос - нет. Если вы поступите таким образом, вы получите беспорядочную информацию со всего мира.
Тем не менее, вы можете получить то же самое, отправив свой вывод одному процессору, который сам выполняет всю запись. Например, в конце вашего приложения просто отправьте все в ранг 0, а в ранг 0 запишите все это в файл.