Файл IO для MPI-FORTRAN - PullRequest
       33

Файл IO для MPI-FORTRAN

4 голосов
/ 30 марта 2012

У меня есть код FORTRAN MPI для решения поля потока.

В начале я хочу прочитать данные из файла и распространить их среди участвующих процессов.

Данные состоят изнесколько трехмерных массивов (скорости в пространстве x, y, z).

Каждый процесс хранит только часть массива.

Так что, если каждый процесс собирается прочитать файл (я думаю, это самый простой способ: он не будет работать, поскольку он будет хранить только первую часть файла, соответствующую количеству массивов, которые может содержать процесс.

MPI Bcast может работать для трехмерных массивов?Но тогда все становится сложным.

Или есть более простой способ?

Ответы [ 3 ]

4 голосов
/ 30 марта 2012

В общем, у вас есть 2 или 3 варианта, в зависимости от вашей платформы.

  1. Один процесс читает входные данные и отправляет (части) их другим процессам. Я бы обычно не использовал для этого трансляцию, поскольку это коллективная операция, и все процессы должны принимать участие. Обычно я просто посылаю необходимую информацию каждому процессу. Если это удобно (а не из-за проблем с памятью), вы, безусловно, могли бы транслировать все входные данные всем процессам, это просто не шаблон работы, который я использую или вижу много.
  2. Все процессы читают данные, которые им требуются. Это может включать процесс, читающий весь входной файл и сохраняющий только те части, которые ему требуются. Но если у вас очень большие входные файлы, вы можете написать подпрограммы для чтения только необходимой части в пространство памяти каждого процесса. Этот подход может включать процессы, конкурирующие за доступ к диску, что является медленным в относительном смысле: если вы выполняете крупномасштабные и длительные параллельные вычисления, ожидающие несколько секунд, пока все процессы получают свои данные, это не является чрезмерной нагрузкой.
  3. Если у вас есть параллельная файловая система, вы можете использовать подпрограммы параллельного ввода-вывода MPI, чтобы каждый процесс считывал только те части входных данных, которые ему требуются.
3 голосов
/ 31 марта 2012

Если вы выполняете свой код на менее чем 1000 ядрах с хорошей файловой системой (например, Luster), тогда просто используйте Fortran I / O, где каждый ранг открывает файл и считывает необходимые ему данные (пропуская остальные). Да, это занимает несколько минут, но вы только читаете файл один раз во время запуска.

MPI I / O (только двоичный) нетривиален, и обычно вам всегда лучше использовать либов более высокого уровня, таких как HDF5 или Parallel NetCDF. Производительность будет зависеть от того, как считываются данные (смежные или несмежные и т. Д.). Следующие ссылки могут быть полезны ...

3 голосов
/ 30 марта 2012

Канонический способ такого шаблона ввода / вывода в MPI:

  • Считайте данные с рангом 0, а затем используйте MPI_Scatter для их распределения.Или, если объем памяти невелик, делайте это по блокам, или затем используйте связь 1-к-1, а не MPI_Scatter.

  • Используйте MPI-I / O, и каждый ранг считывает свое собственное подмножествофайла данных (чтобы быть полезным, это, конечно, требует формат файла, в котором вы можете определить границы без предварительного чтения всего файла).

Для максимальной масштабируемости можнообъединить два подхода, то есть подмножество процессов (скажем, sqrt (N), как грубое правило), использовать ввод-вывод MPI, и каждый процесс MPI отправляет данные в свой собственный процесс ввода-вывода.

...