并行程序设计基础——远程存储访问

目录

一、概述

二、窗口创建和操作

1、创建窗口

1.1 MPI_WIN_CREATE

1.2 MPI_FREE

2、向窗口写

2.1 MPI_PUT

3、从窗口读

3.1 MPI_GET

4、对窗口数据的运算

4.1 MPI_ACCUMULATE

4.2 MPI_WIN_GET_GROUP

三、窗口同步管理

1、栅栏方式

1.1 MPI_WIN_FENCCE

2、握手方式

2.1 MPI_WIN_START

2.2 MPI_WIN_COMPLETE

2.3 MPI_WIN_POST

2.4 MPI_WIN_WAIT

2.5 MPI_WIN_TEST

3、锁方式

3.1 MPI_WIN_LOCK 

3.2 MPI_WIN_UNLOCK

四、小结


        远程存储访问是直接对非本地存储空间进行访问,从本节开始,我们介绍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

        窗口创建后得到的窗口对象并不是指本进程的窗口,而是指整个组调用的窗口,使用该窗口对象可以访问任何一个进程组内的窗口。

  • 18
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猿核试Bug愁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值