图17-3 视口与基本类型、文件类型和文件的关系图示



文件视口可以用一个三元组来表达:
<起始偏移,基本类型,文件类型>
其中偏移是指该视口在文件中的起始位置,该位置度量是以字节为单位的;而基本类型是视口数据存取的基本单位,基本类型可以是MPI的预定义数据类型或派生数据类型;文件类型或者就是基本类型,或者是从基本类型派生出来的其它类型,文件类型真正限定了文件中哪些数据可以被视口访问,哪些数据对视口是不可见的。文件视口就是文件中从特定的偏移开始,连续多个直至文件结束的特定文件类型组成的。

MPI_FILE_SET_VIEW(fh, disp,etype,filetype,datarep,info)
INOUTfh视口对应文件的文件句柄
IN disp视口在文件中的偏移位置
IN etype 视口基本数据类型
IN filetype视口文件类型
IN datarep 视口数据的表示方法
IN info传递给运行时的信息
int MPI_File_set_view(MPI_File fh, MPI_Offset disp, MPI_Datatype etype,
MPI_Datatype filetype, char * datarep, MPI_Info info)
MPI_FILE_SET_VIEW(FH, DISP, ETYPE, FILETYPE, DATAREP, INFO,
IERROR)
CHARACTER *(*) DATAREP
INTEGER FH, ETYPE, FILETYPE,INFO,IERROR

MPI_FILE_SET_VIEW设置文件视口,它是一个组IO调用,所有与fh相联系的进程组中的进程都执行这一调用。调用进程在fh对应的文件中设置本进程的文件视口,该视口相对于文件头的偏移是disp,即视口首先从文件中跳过disp个字节,然后给出了视口数据的基本数据单位etype,以后所有对该视口的访问必须以etype为单位来进行,而filetype则在etype的基础上,通过以etype为单位定义数据类型filetype,将视口不需要的数据排斥在外,即一般filetype定义的数据类型是有"空穴"的,这些空穴是视口无需访问的数据。
由上不难看出,文件视口其实就是一种特殊的数据类型,它指定的位置不象前面定义派生数据类型那样是在内存中,而是在文件中。它的另一个约束是都必须以基本的数据单位etype为基础来进行定义,而不是可以任意使用不同的数据类型来定义;视口包含数据的多少其实是通过定义内容不连续的数据类型filetype来实现的,该类型中不连续的部分是视口不需要访问的部分,手段指定本视口包括哪些数据;从偏移disp开始,连续重复N次直到文件结束,由数据类型filetype得到的新的派生数据类型,才是文件视口对应数据类型。
以后当进程对它们各自的文件视口进行访问时,可以认为该文件中只包含视口对应的数据,而且数据之间是没有空隙的。
不同的进程,通过在相同的文件上定义互不交叉的文件视口,就可以实现对文件的并行访问。
MPI_FILE_SET_VIEW调用完成后,原来的文件句柄fh就不再代表该文件,而是代表本调用产生的文件视口,以后使用fh对文件的所有操作都是对其视口的操作