next up previous contents
Next: Внешнее представление данных: external32 Up: Возможность взаимодействия с файлом Previous: Возможность взаимодействия с файлом   Contents

Типы данных для взаимодействия с файлом

Если представление данных файла отличается от исходного, должны быть приняты меры предосторожности при конструировании 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).[]



Alex Otwagin 2002-12-10