| |
MPI поддерживает по одному индивидуальному файловому указателю в процессе на каждый дескриптор файла. Текущее значение этого указателя неявно определяет смещение в подпрограммах доступа к данным, описанных в данном разделе. Данные подпрограммы используют и обновляют только индивидуальные файловые указатели, поддерживаемые MPI. Общие файловые указатели не используются и не обновляются. Подпрограммы с использованием индивидуальных файловых указателей имеют ту же семантику, что и доступ к данным через подпрограммы точного смещения, описанные в разделе Data Access with Explicit Offsets , со следующим изменением:
После того как была инициирована операция с файловым указателем, индивидуальный файловый указатель изменяется так, чтобы указывать на следующий е-тип после последнего, к которому был осуществлен доступ. Файловый указатель изменяется относительно текущего вида файла.
Если был определен тип доступа MPI_MODE_SEQUENTIAL, когда
открывался файл, то вызывать подпрограммы из данного раздела
ошибочно.
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 )
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.
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 записывает файл, используя индивидуальный файловый указатель.
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.
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 )
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.
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 может быть отрицательным, что позволяет вести поиск в обратном направлении. Ошибочно переходить к отрицательным для вида позициям.
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() constMPI_FILE_GET_POSITION возвращает, в аргументе offset, текущую позицию индивидуального файлового указателя в единицах е-типа относительно текущего вида.
Совет пользователям:
Смещение может быть использовано при дальнейших вызовах
MPI_FILE_SEEK, используя whence = MPI_SEEK_SET, для возврата
к текущей позиции. Чтобы установить смещение файлового
указателя, сначала необходимо преобразовать offset в абсолютную
позицию байта, используя MPI_FILE_GET_BYTE_OFFSET, а затем
вызвать MPI_FILE_SET_VIEW с получившимся смещением. []
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) constMPI_FILE_GET_BYTE_OFFSET преобразует смещение относительно вида в абсолютную позицию байта. Абсолютная позиция байта (от начала файла) с данным смещением offset относительно текущего вида fh возвращается в disp.
Закладки на сайте Проследить за страницей |
Created 1996-2024 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |