© Георгиевский Анатолий, 05.11.2005

Коллективный ввод/вывод

Операции ввода/вывода в MPI-2

В MPI-1 отсутствуют операции коллективного ввода-вывода, сразу не придумали. В MPI-2 поддержка коллективного ввода-вывода появилась и требует внимания, хотя бы для понимания сути явления. Я применил здесь термин "коллективный" ради двусмысленности: множество процессов может одновременно создавать один поток данных и параллельно читать фрагменты потока данных.

Ни одна традиционная файловая система не может обеспечить достаточной гибкости и эффективности для организации одновременной записи в файл несколькими процессами. Нужна специализированная "Параллельная" система ввода-вывода, которая обеспечивала бы фрагментирование потока данных, занималась бы синхронизацией данных между процессами и обеспечивала бы децентрализванное хранение данных. Можно бы назвать такую систему "Глобальной файловой системой". Сформулировал и нашел в google "Обчислювальний кластер Київського національного університету", где хлопцы тут же и забраковали gfs (Global File System) от Красной Шапочки, как недостаточно стабильную. Нашел ещё один проект pvfs2 (Parallel Virtual File System), которая, файловая система, поддерживается в MPI-2. Потом нашел ROMIO - реализацию MPI-IO, которая, как оказалось, включена в версию MPICH-1.2.5. Присмотрелся к содержимому файла mpio.h на своем компьютере и понял, что в чем-то нам повезло. MPI-IO - операции коллективного ввода-вывода в нашей версии, под Windows, реализованы поверх NTFS. Ещё по дороге выяснил, что при некоторых ограничениях MPI-IO в данной версии живет поверх nfs (Network file system), ufs (Unix File System) и pvfs (Parallel Virtual File System). Братьев по разуму, линуксоидов, тоже не обделили.

Документация по MPI-IO входит девятой главой в стандарт MPI-2.

... Я придумаю свой собственный язык описания кривизны пространства

MPI-IO - операции коллективного ввода-вывода

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

911 - определения

file
в MPI файлом называется упорядоченная коллекция данных определенного типа.
displacement
расположение данных, длина в байтах относительно начала файла данных
etype
определяет тип элемента потока данных
filetype
шабон данных при последовательном наложении на поток данных образует области "видимости" доступные для чтения или записи. Схематично принцип наложения шаблонов показан на рисунке

При параллельной обработке данных каждому процессу может быть назначен свой шаблон, обеспечивающий конвейерную обработку данных

view
видимая область,
offset
смещение от начала видимой области, выраженное в количеством элементов данных. При вычислении положения в файле "дыры" в шаблоне filetype не считаются. Например, для процесса 1 offset=2 будет указвать на 8-й элемент данных.
int MPI_File_open(MPI_Comm comm, char *filename, int amode, MPI_Info info, MPI_File *fh);
Открывает файл с именем filename для всех процессов в коммуникационной группе comm и возвращает дескриптор файла fh, по которому осуществляется доступ в режиме amode. MPI_File_set_view()

Режимы доступа к потоку данных

MPI_MODE_RDONLY
только чтение
MPI_MODE_RDWR
чтение и запись
MPI_MODE_WRONLY
только запись
MPI_MODE_CREATE
разрешает создание нового файла
MPI_MODE_EXCL
запрещает использование существующего файла
MPI_MODE_DELETE_ON_CLOSE
зпрашивает удаление файла после закрытия
MPI_MODE_UNIQUE_OPEN
запрашивает эксклюзивнй доступ к файлу
MPI_MODE_SEQUENTIAL
запрашивается последовательный доступ к данным
MPI_MODE_APPEND
устанавливает указатель записи в конец файла, файл будет дописываться

Режимы кодируются битами, константы можно комбинировать с помощью побитовой операции "или" для достижения нужного эффекта. Некоторые режимы взаимоисключающие. Например, при чтении-записи, доступ не может быть последовательным. А режим только чтение исключает запись.

Основной параметр оптимизации процесса - последовательное чтение или запись, позволяет снизить время доступа к данным.

int MPI_File_close(MPI File *fh)
Завершает работу с файлом.

(5 ноября 2005 г.)