Если представление данных файла отличается от исходного, должны
быть приняты меры предосторожности при конструировании etypes и
filetypes. Любая из функций-конструкторов типов данных может
использоваться; однако для тех функций, которым передаются смещения
байтов, эти смещения должны быть определены в терминах,
соответствующих их значениям для файла, т.е. по правилам текущего
представления данных файла. MPI будет интерпретировать эти смещения
байтов нужным образом; никакого масштабирования делаться не будет.
Функция MPI_FILE_GET_TYPE_EXTENT
может использоваться для вычисления
экстентов типов данных в файле. Для etypes и filetypes, которые
являются портируемыми типами данных (см. секцию 1.4), MPI будет
масштабировать любые смещения в типах данных так, чтобы эти данные
соответствовали их представлению в файле. Типы данных, передаваемые
как аргументы в подпрограммы чтения-записи, определяют размещение
самих данных в памяти; поэтому, они всегда должны конструироваться,
используя смещения, соответствующие смещениям в памяти.
Совет пользователям: Логично было бы думать о файле таким
образом, что он расположен в памяти файлового сервера. etype
и
filetype
интерпретируются так, будто они были определены на этом
файловом сервере той же самой последовательностью вызовов, что
использовалась для их определения самим вызывающим процессом. Если
представление данных native
, то этот логический файловый сервер
работает на той же самой архитектуре, что и вызывающий процесс - так,
что эти типы определяют расположение данных в файле таким образом,
будто типы определены в памяти вызывающего процесса.
Если etype
и
filetype
- портируемые типы данных, то расположение определяемых
данных в файле совпадает с их расположением в памяти при определении
в вызывающем процессе до фактора масштабирования. Подпрограмма
MPI_FILE_GET_FILE_EXTENT
может использоваться, чтобы вычислить этот
фактор масштабирования. Таким образом, два эквивалентных портируемых
типа данных определяют одинаковое расположение своих данных в файле,
даже в гетерогенной окружающей среде с internal
, external32
или
определяемым пользователем представлением этих данных. Если типы не
портируемые, но эквивалентны, etype
и filetype
должны быть
сконструированы так, чтобы их typemap и экстент были одинаковыми для
любой архитектуры. Это может быть достигнуто, если они имеют явные
верхние и нижние границы (определенное с помощью
MPI_TYPE_CREATE_RESIZED)
. Это условие должно также выполняться для
любого типа данных, который используется при конструировании etype
и
filetype
, если он копируется - либо явно, вызовом
MPI_TYPE_CONTIGUOUS
, либо неявно, когда определяющий длину блока
аргумент больше единицы. Если etype
или filetype
не являются
портативными и имеют архитектурно-зависимую typemap или экстент, то
расположение их данных зависит от конкретной реализации.
Представления данных, отличные от native
, в файле, могут
отличаться от соответствующих представлений данных в памяти. Поэтому,
для этих представлений данных в файле, важно не использовать
``жесткие'' смещения байтов для позиционирования в файле, включая
начальное смещение, с которого начинается просмотр. Когда портируемый
тип данных (см. раздел 1.4) используется в операциях доступа к
информации, любые ``окна'' в нем обсчитываются так, чтобы было
соответствие представлению данных. Однако, обратите внимание на то,
что эта тактика срабатывает только тогда, когда все процессы, которые
создали ``вид'' файла, строят свои etypes из одинаковых
предопределенных типов данных. Например, если один процесс использует
etype
, построенный из MPI_INT
, а другой использует etype
, построенный
из MPI_FLOAT
, то результирующие ``виды'' могут оказаться
непортативными, потому что относительные размеры этих типов могут
отличиться в одном и во втором представлении данных.[]
MPI_FILE_GET_TYPE_EXTENT(fh, datatype, extent)
IN |
fh |
Файловый указатель (указатель) | |
IN |
datatype |
Тип данных (указатель) | |
OUT |
extent |
Экстент типа данных (целое) |
int MPI_File_get_type_extent(MPI_File fh, MPI_Datatype datatype,
MPI_Aint *extent)
MPI_FILE_GET_TYPE_EXTENT(FH, DATATYPE, EXTENT, IERROR)
INTEGER FH, DATATYPE, IERROR
INTEGER(KIND=MPI_ADDRESS_KIND) EXTENT
MPI::Aint MPI::File::Get_type_extent(const MPI::Datatype& datatype)
const
MPI_FILE_GET_TYPE_EXTENT
возвращает экстент datatype
в файле fh
.
Этот экстент будет одинаковым для всех процессов, обращающихся к файлу
fh
. Если текущий ``вид'' использует определяемое пользователем
представление данных (см. секцию 7.5.3), то MPI использует возвратную
функцию dtype_file_extent_fn
, чтобы вычислить экстент.
Совет разработчикам: В случае определяемых пользователем
представлений данных, экстент производного типа данных может быть
вычислен первым определением экстентов предопределенных типов
данных в этом производном типе данных, с помощью dtype_file_extent_fn
(см. раздел 7.5.3).[]