Простой ответ заключается в том, что вы не можете делать это автоматически с помощью MPI.
Вы можете убедиться, что MPI_File_open()
- это коллективный вызов, принимающий внутри-коммуникатор в качестве первого аргумента и возвращающий обработчик файла в открытый файл как последний аргумент. В этом коммуникаторе все процессы открывают файл, и поэтому все процессы должны видеть файл. Поэтому, если процесс не видит файл, он не может получить обработчик MPI_file
для доступа к нему.
Теперь это не означает, что решения нет. Возможность может быть сделана вручную именно тем, что вы описали, а именно:
- Каждый процесс MPI открывает индивидуально файл, который они видят и несет ответственность; затем
- Каждый из этих процессов считывает этот локальный файл в буфер;
- Тезисы отдельных буферов открыты, используя либо глобальные окна памяти
MPI_Win
, либо несколько отдельных, готовых для одностороннего доступа к чтению; и наконец
- Все прочитанные обращения к любым данным, которые ранее были сохранены в этих отдельных локальных файлах, теперь выполняются через вызовы
MPI_Get()
с использованием окон (ов) памяти.
Настоящим ограничением этого подхода является то, что он требует полного считывания всех отдельных файлов, поэтому для хранения каждого из них необходимо иметь достаточное количество памяти на узел. Я хорошо знаю, что это очень большое предупреждение, которое может просто сделать решение совершенно непрактичным. Однако, если памяти достаточно, это простой подход.
Другим даже более простым решением было бы хранить файлы в общей файловой системе или их копировать во все локальные файловые системы. Я предполагаю, что это не вариант, так как вопрос не был бы задан иначе ...
Наконец, в последнем случае возможность, которую я вижу, состоит в том, чтобы выделить процесс MPI (или поток OpenMP MPI процесс) на узел для обслуживания каждого файла. Этот процесс будет действовать только как «файловый сервер», отвечая на запрос «читать», поступающий из других процессов MPI, и обслуживает их, читая запрошенные данные из файла и отправляя их обратно через MPI. Это немного длинный, чтобы писать, но он должен работать.
Что вы подразумеваете под «Набор файлов распределен между различными процессами»? Означает ли это, что эти файлы находятся в локальных файловых системах, только смонтированы/видимы для данного процесса MPI, а не другого? (например, на '/ tmp' различных вычислительных узлов) – Gilles
@Gilles Правильно, это означает, что эти файлы находятся в локальных файловых системах, только смонтированы/видимы для данного процесса MPI, а не для другого. – syko