next up previous contents
Next: Доступ к данным с Up: Доступ к данным. Previous: Доступ к данным с   Contents

Доступ к данным с индивидуальными файловыми указателями.

MPI поддерживает по одному индивидуальному файловому указателю в процессе на каждый дескриптор файла. Текущее значение этого указателя неявно определяет смещение в подпрограммах доступа к данным, описанных в данном разделе. Данные подпрограммы используют и обновляют только индивидуальные файловые указатели, поддерживаемые MPI. Общие файловые указатели не используются и не обновляются. Подпрограммы с использованием индивидуальных файловых указателей имеют ту же семантику, что и доступ к данным через подпрограммы точного смещения, описанные в разделе Data Access with Explicit Offsets , со следующим изменением:

После того как была инициирована операция с файловым указателем, индивидуальный файловый указатель изменяется так, чтобы указывать на следующий е-тип после последнего, к которому был осуществлен доступ. Файловый указатель изменяется относительно текущего вида файла.

Если был определен тип доступа MPI_MODE_SEQUENTIAL, когда открывался файл, то вызывать подпрограммы из данного раздела ошибочно.



MPI_FILE_READ(fh, buf, count, datatype, status)



INOUT fh дескриптор файла (дескриптор)
OUT buf начальный адрес буфера (выбор)
IN count количество элементов в буфере (целое)
IN datatype тип данных каждого элемента буфера (дескриптор)
OUT status объект состояния (Status)




int MPI_File_read(MPI_File fh, void *buf, int count, MPI_Datatype datatype, MPI_Status *status) MPI_FILE_READ(FH, BUF, COUNT, DATATYPE, STATUS, IERROR) <type> BUF(*) INTEGER FH, COUNT, DATATYPE, STATUS(MPI_STATUS_SIZE), IERROR void MPI::File::Read(void* buf, int count, constMPI::Datatype& datatype, MPI::Status& status) void MPI::File::Read(void* buf, int count, const MPI::Datatype& datatype) MPI_FILE_READ читает файл, используя индивидуальный файловый указатель.

Пример Следующий фрагмент кода на ФОРТРАН - это пример чтения файла до достижения его конца: ! Читает существующий файл ввода,до тех пор ! пока не будут прочитаны все данные. ! Вызывает подпрограмму "process_input", если ! прочитаны все запрошенные данные. ! Оператор "exit" языка Fortran 90 завершает ! цикл. integer bufsize, numread, totprocessed, status(MPI_STATUS_SIZE) parameter (bufsize=100) real localbuffer(bufsize) call MPI_FILE_OPEN( MPI_COMM_WORLD, 'myoldfile', & MPI_MODE_RDONLY, MPI_INFO_NULL, myfh, ierr ) call MPI_FILE_SET_VIEW( myfh, 0, MPI_REAL, MPI_REAL, 'native', & MPI_INFO_NULL, ierr ) totprocessed = 0 do call MPI_FILE_READ( myfh, localbuffer, bufsize, MPI_REAL, & status, ierr ) call MPI_GET_COUNT( status, MPI_REAL, numread, ierr ) call process_input( localbuffer, numread) totprocessed = totprocessed + numread if ( numread < bufsize ) exit enddo write(6,1001) numread, bufsize, totprocessed 1001 format( "No more data: read", I3, "and expected", I3, & "Processed total of", I6, "before terminating job." ) call MPI_FILE_CLOSE( myfh, ierr )



MPI_FILE_READ_ALL(fh, buf, count, datatype, status)



INOUT fh дескриптор файла (дескриптор)
OUT buf начальный адрес буфера (выбор)
IN count количество элементов в буфере (целое)
IN datatype тип данных каждого элемента буфера (дескриптор)
OUT status объект состояния (Status)




int MPI_File_read_all(MPI_File fh, void *buf, int count, MPI_Datatype datatype, MPI_Status *status) MPI_FILE_READ_ALL(FH, BUF, COUNT, DATATYPE, STATUS, IERROR) <type> BUF(*) INTEGER FH, COUNT, DATATYPE, STATUS(MPI_STATUS_SIZE), IERROR void MPI::File::Read_all(void* buf, int count, const MPI::Datatype& datatype, MPI::Status& status) void MPI::File::Read_all(void* buf, int count, const MPI::Datatype& datatype) MPI_FILE_READ_ALL - это коллективная версия блокирующего интерфейса MPI_FILE_READ.





MPI_FILE_WRITE(fh, buf, count, datatype, status)



INOUT fh дескриптор файла (дескриптор)
IN buf начальный адрес буфера (выбор)
IN count количество элементов в буфере (целое)
IN datatype тип данных каждого элемента буфера (дескриптор)
OUT status объект состояния (Status)




int MPI_File_write(MPI_File fh, void *buf, int count, MPI_Datatype datatype, MPI_Status *status) MPI_FILE_WRITE(FH, BUF, COUNT, DATATYPE, STATUS, IERROR) <type> BUF(*) INTEGER FH, COUNT, DATATYPE, STATUS(MPI_STATUS_SIZE), IERROR void MPI::File::Write(const void* buf, int count, const MPI::Datatype& datatype, MPI::Status& status) void MPI::File::Write(const void* buf, int count, const MPI::Datatype& datatype) MPI_FILE_WRITE записывает файл, используя индивидуальный файловый указатель.





MPI_FILE_WRITE_ALL(fh, buf, count, datatype, status)



INOUT fh дескриптор файла (дескриптор)
IN buf начальный адрес буфера (выбор)
IN count количество элементов в буфере (целое)
IN datatype тип данных каждого элемента буфера (дескриптор)
OUT status объект состояния (Status)




int MPI_File_write_all(MPI_File fh, void *buf, int count, MPI_Datatype datatype, MPI_Status *status) MPI_FILE_WRITE_ALL(FH, BUF, COUNT, DATATYPE, STATUS, IERROR) <type> BUF(*) INTEGER FH, COUNT, DATATYPE, STATUS(MPI_STATUS_SIZE), IERROR void MPI::File::Write_all(const void* buf, int count, const MPI::Datatype& datatype, MPI::Status& status) void MPI::File::Write_all(const void* buf, int count, const MPI::Datatype& datatype) MPI_FILE_WRITE_ALL - это коллективная версия блокирующего интерфейса MPI_FILE_WRITE.





MPI_FILE_IREAD(fh, buf, count, datatype, request)



INOUT fh дескриптор файла (дескриптор)
OUT buf начальный адрес буфера (выбор)
IN count количество элементов в буфере (целое)
IN datatype тип данных каждого элемента буфера (дескриптор)
OUT request объект запроса (дескриптор)




int MPI_File_iread(MPI_File fh, void *buf, int count, MPI_Datatype datatype, MPI_Request *request) MPI_FILE_IREAD(FH, BUF, COUNT, DATATYPE, REQUEST, IERROR) <type> BUF(*) INTEGER FH, COUNT, DATATYPE, REQUEST, IERROR MPI::Request MPI::File::Iread(void* buf, int count, const MPI::Datatype& datatype) MPI_FILE_IREAD - это неблокирующая версия интерфейса MPI_FILE_READ.

Пример Данный фрагмент кода ФОРТРАНa иллюстрирует семантику обновления файловых указателей: ! Читает двадцать первых вещественных чисел в ! два локальных буфера. Заметим, что когда ! завершается первая MPI_FILE_IREAD, файловый ! указатель обновляется и указывает на ! одиннадцатое вещественное чисел в файле. integer bufsize, req1, req2 integer, dimension(MPI_STATUS_SIZE) :: status1, status2 parameter (bufsize=10) real buf1(bufsize), buf2(bufsize) call MPI_FILE_OPEN( MPI_COMM_WORLD, 'myoldfile', & MPI_MODE_RDONLY, MPI_INFO_NULL, myfh, ierr ) call MPI_FILE_SET_VIEW( myfh, 0, MPI_REAL, MPI_REAL, 'native', & MPI_INFO_NULL, ierr ) call MPI_FILE_IREAD( myfh, buf1, bufsize, MPI_REAL, & req1, ierr ) call MPI_FILE_IREAD( myfh, buf2, bufsize, MPI_REAL, & req2, ierr ) call MPI_WAIT( req1, status1, ierr ) call MPI_WAIT( req2, status2, ierr ) call MPI_FILE_CLOSE( myfh, ierr )



MPI_FILE_IWRITE(fh, buf, count, datatype, request)



INOUT fh дескриптор файла (дескриптор)
IN buf начальный адрес буфера (выбор)
IN count количество элементов в буфере (целое)
IN datatype тип данных каждого элемента буфера (дескриптор)
OUT request объект запроса (дескриптор)




int MPI_File_iwrite(MPI_File fh, void *buf, int count, MPI_Datatype datatype, MPI_Request *request) MPI_FILE_IWRITE(FH, BUF, COUNT, DATATYPE, REQUEST, IERROR) <type> BUF(*) INTEGER FH, COUNT, DATATYPE, REQUEST, IERROR MPI::Request MPI::File::Iwrite(const void* buf, int count, const MPI::Datatype& datatype) MPI_FILE_IWRITE - это неблокирующая версия интерфейса MPI_FILE_WRITE.





MPI_FILE_SEEK(fh, offset, whence)



INOUT fh дескриптор файла (дескриптор)
IN offset смещение (целое)
IN whehence тип обновления (положение)




int MPI_File_seek(MPI_File fh, MPI_Offset offset, int whence) MPI_FILE_SEEK(FH, OFFSET, WHENCE, IERROR) INTEGER FH, WHENCE, IERROR INTEGER(KIND=MPI_OFFSET_KIND) OFFSET void MPI::File::Seek(MPI::Offset offset, int whence) MPI_FILE_SEEK изменяет индивидуальный файловый указатель относительно аргумента whence, который может иметь следующие значения:

offset может быть отрицательным, что позволяет вести поиск в обратном направлении. Ошибочно переходить к отрицательным для вида позициям.





MPI_FILE_GET_POSITION(fh, offset)



IN fh дескриптор файла (дескриптор)
OUT offset смещение (целое)




int MPI_File_get_position(MPI_File fh, MPI_Offset *offset) MPI_FILE_GET_POSITION(FH, OFFSET, IERROR) INTEGER FH, IERROR INTEGER(KIND=MPI_OFFSET_KIND) OFFSET MPI::Offset MPI::File::Get_position() const MPI_FILE_GET_POSITION возвращает, в аргументе offset, текущую позицию индивидуального файлового указателя в единицах е-типа относительно текущего вида.

Совет пользователям: Смещение может быть использовано при дальнейших вызовах
MPI_FILE_SEEK, используя whence = MPI_SEEK_SET, для возврата к текущей позиции. Чтобы установить смещение файлового указателя, сначала необходимо преобразовать offset в абсолютную позицию байта, используя MPI_FILE_GET_BYTE_OFFSET, а затем вызвать MPI_FILE_SET_VIEW с получившимся смещением. []



MPI_FILE_GET_BYTE_OFFSET(fh, offset, disp)



IN fh дескриптор файла (дескриптор)
IN offset смещение (целое)
OUT disp абсолютная позиция байта с данным смещением (целое)




int MPI_File_get_byte_offset(MPI_File fh, MPI_Offset offset, MPI_Offset *disp) MPI_FILE_GET_BYTE_OFFSET(FH, OFFSET, DISP, IERROR) INTEGER FH, IERROR INTEGER(KIND=MPI_OFFSET_KIND) OFFSET, DISP MPI::Offset MPI::File::Get_byte_offset(const MPI::Offset disp) const MPI_FILE_GET_BYTE_OFFSET преобразует смещение относительно вида в абсолютную позицию байта. Абсолютная позиция байта (от начала файла) с данным смещением offset относительно текущего вида fh возвращается в disp.


next up previous contents
Next: Доступ к данным с Up: Доступ к данным. Previous: Доступ к данным с   Contents
Alex Otwagin 2002-12-10