目录
远程存储访问是直接对非本地存储空间进行访问,从本节开始,我们介绍MPI-2提供的三种基本远程存储访问方式:读、写、累计。远程存储访问的最大特点是不需要对方的进程参与通信,MPI-2是通过“窗口”来实现远程存储访问的。
一、概述
MPI-2中新增加了远程存储访问的能力,主要是为了使MPI在编写特定算法和通信模型的并行程序时,更加自然和简洁。因为在许多情况下,都需要一个进程对另一个进程的存储区域进行直接访问。MPI-2对远程存储的访问主要通过“窗口”来进行,为了进行远程存储访问,首先需要定义一个“窗口”,该“窗口”开在各个进程的一段本地进程存储空间,其目的是为了让其它的进程可以通过这个窗口来访问本地的数据。
定义好窗口之后,就可以通过窗口来访问远程存储区域的数据了,MPI-2提供了三种基本访问形式“读”、“写”、“累计”。“读”操作只是从远端的窗口获取数据,并不对远端数据进行任何修改;“写”操作将本地的内容写入远端窗口,它修改远端窗口的内容;“累计”操作复杂一些,它将远端窗口的数据和本地的数据进行某种指定方式的运算之后,再将运算的结果写入远端窗口。
MPI-2就是通过“读”、“写”、“累计”三种操作来实现对远程存储的访问和更新的。除了基本的窗口操作之外,MPI-2还提供了窗口管理功能,用来实现对窗口操作的同步管理。MPI-2对窗口的同步管理有三种方式:
①栅栏(fence)方式。在这种方式下,对窗口的操作必须放在一对栅栏语句之间,这样可以保证当栅栏语句结束之后,其内部的窗口操作可以正确完成。
②握手方式。在这种方式下,调用窗口操作的进程需要将具体的窗口操作放在以MPI_WIN_START开始,以MPI_WIN_COMPLETE结束的调用之间,相应的,被访问的远端进程需要以一对调用MPI_WIN_POST和MPI_WIN_WAIT与之相适应。MPI_WIN_POST允许其它的进程对自己的窗口进行访问,而MPI_WIN_WAIT调用结束之后可以保证对本窗口的调用操作全部完成。MPI_WIN_START申请对远端进程窗口的访问,只有当远端窗口执行了MPI_WIN_POST操作之后才可以访问远端窗口,MPI_WIN_COMPLETE完成对远端窗口的访问操作。
③锁方式。在这种方式下,不同的进程通过对特定的窗口加锁来实现互斥访问,当然用户根据需要可以使用共享的锁,这时就可以允许使用共享锁的进程对同一窗口同时访问。
远端存储的访问,窗口是具体的实现形式,通过窗口操作实现来实现单边通信,通过对窗口的管理操作来实现对窗口操作的同步控制。
二、窗口创建和操作
1、创建窗口
1.1 MPI_WIN_CREATE
MPI_WIN_CREATE在本地的一片特定的存储空间上开辟一个“窗口”,其它的进程就可以通过这一窗口来直接访问该窗口限定的存储空间。该空间的基地址是base,以字节为单位的空间大小是size,在该窗口上以字节为单位的数据类型偏移为disp_unit,传递给运行时的信息为info。如果给定窗口大小size=0,则表示该窗口没有存储区域可以被其它进程访问。
MPI_WIN_CREATE(base, size, disp_unit, info, comm, win)
IN base 窗口空间的初始地址
IN size 以字节为单位的窗口空间大小
IN disp_unit 一个偏移单位对应的字节数
IN info 传递给运行时的信息
IN comm 通信域
OUT win 返回的窗口对象
//c语言的说明
int MPI_Win_create(void *base, MPI_Aint size, int disp_unit, MPI_Info info, MPI_Comm comm, MPI_Win *win)
//Fortran语言的说明
MPI_WIN_CREATE(BASE, SIZE, DISP_UNIT, INFO, COMM, WIN, IERROR)
<type> BASE(*)
INTEGER (KIND=MPI_ADDRESS_KIND) SIZE
INTEGER DISP_UNIT, INFO, COMM, WIN, IERROR
该调用是一个组调用,所有comm通信域之内的进程都要执行,它返回一个窗口对象,该窗口并不只是表示本地窗口。它是建立在整个组的窗口,通过这一窗口对象并指定组内的特定进程,就可以访问组内的任何一个进程提供给窗口的存储区域,实现远程存储访问。
1.2 MPI_FREE
与MPI_WIN_CREATE操作相对应,MPI_WIN_FREE将前面创建的窗口对象释放掉,它也是一个组调用,组内的所有进程都需要它执行,它返回后将原来的窗口对象置为空MPI_WIN_NULL。在所有的远程存储访问完成后,执行这一操作释放掉不再使用的对象。
MPI_WIN_FREE(win)
INOUT win 窗口对象,输入为要释放的窗口,返回为空
//c语言的说明
int MPI_Win_free(MPI_Win *win)
//Fortran语言的说明
MPI_WIN_FREE(WIN, IERROR)
INTEGER WIN, IERROR
窗口创建后得到的窗口对象并不是指本进程的窗口,而是指整个组调用的窗口,使用该窗口对象可以访问任何一个进程组内的窗口。