2015-11-26 3 views
0

У меня возникли вопросы по работе с файловыми вводами/выводами с использованием MPI.MPI односторонний файл I/O

Набор файлов распределен между различными процессами. Я хочу, чтобы процессы читали файлы в других процессах.

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

Возможно ли это в MPI? Я прочитал много документов о MPI, но не смог найти точного.

+1

Что вы подразумеваете под «Набор файлов распределен между различными процессами»? Означает ли это, что эти файлы находятся в локальных файловых системах, только смонтированы/видимы для данного процесса MPI, а не другого? (например, на '/ tmp' различных вычислительных узлов) – Gilles

+0

@Gilles Правильно, это означает, что эти файлы находятся в локальных файловых системах, только смонтированы/видимы для данного процесса MPI, а не для другого. – syko

ответ

1

Простой ответ заключается в том, что вы не можете делать это автоматически с помощью MPI.

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

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

  1. Каждый процесс MPI открывает индивидуально файл, который они видят и несет ответственность; затем
  2. Каждый из этих процессов считывает этот локальный файл в буфер;
  3. Тезисы отдельных буферов открыты, используя либо глобальные окна памяти MPI_Win, либо несколько отдельных, готовых для одностороннего доступа к чтению; и наконец
  4. Все прочитанные обращения к любым данным, которые ранее были сохранены в этих отдельных локальных файлах, теперь выполняются через вызовы MPI_Get() с использованием окон (ов) памяти.

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

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

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

+0

Спасибо за приятные комментарии. К сожалению, только последнее предложение будет работать для меня ...Есть ли у вас хорошая реализация очередей сообщений, реализованных через MPI? – syko

+0

Как создать область mmap над файлами и поделиться ими как «окна» в MPI для односторонней связи? – syko

Смежные вопросы