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() const
MPI_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) const
MPI_FILE_GET_BYTE_OFFSET преобразует смещение
относительно вида в абсолютную позицию байта. Абсолютная
позиция байта (от начала файла) с данным смещением offset
относительно текущего вида fh возвращается в disp.