《并行计算的编程模型》一1.7 单边通信

简介: 本节书摘来华章计算机《并行计算的编程模型》一书中的第1章 ,第1.7节, [(美)帕万·巴拉吉(Pavan Balaji)编著;张云泉等译,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

1.7 单边通信

在点对点通信和聚合通信方式中,发送进程和接收进程共同参与通信过程。MPI提供另外一种通信方式,即单边通信方式。在单边通信方式中,单个进程便可指定发送和接收的数据。单边通信主要用于ARMCI/GA(见第5章)、UPC(见第4章)和OpenSHMEM(见第3章)等函数库中,单边通信也可称之为远程内存访问(RMA)。
单边通信模型主要分为三部分。第一部分是创建MPI_Win窗口对象,用于可被其他进程访问的内存区域。第二部分是进程间数据移动方式,包含从远程进程上读、写、更新等数据移动方式。第三部分是实现对单边通信完成情况进行等待或者检查等操作。单边通信模型中每一部分均有唯一的MPI格式。
MPI提供四种创建内存访问窗口方法,从而针对不同的应用需求。MPI_Win_create、MPI_Win_allocate和MPI_Win_allocate_shared三种函数为聚合方式,用于指定可被其他进程读取和写入的内存区域。MPI_Win_create_dynamic函数允许单独进程对其内存空间进行申请和释放。
单边通信函数类型比较简单,分为读、写、更新三种。最简单的单边通信函数是通过MPI_Put函数向远端进程写入数据(MPI-2 RMA中唯一定义的原始单边通信函数),通过MPI_Get函数从远端进程读取数据,以及通过MPI_Accumulate函数利用MPI预定义的归约操作对远端进程中的数据进行更新。MPI-3对这三种单边通信函数进行了完善,增加了非阻塞式单边通信方式,从而为用户提供更加灵活的MPI实现方式。
由于MPI提供非阻塞式单边通信方式,因此需要提供额外的函数检查或者等待非阻塞式通信操作。MPI提供三种方式完成非阻塞式单边通信。最简单的方式为调用MPI_Win_fence函数,该函数属于组调用方式,在一对MPI_Win_fence调用函数间完成进程间数据通信操作。当MPI_Win_fence函数完成调用后,所有的单边通信操作均已完成,例如数据缓冲区中的数据已被更改,本地进程中内存数据已完成定义的数据操作,可被本地进程自由访问或更改。读者可以通过查询MPI手册来获取更多关于单边通信方式的介绍。在一定程度上,MPI_Win_fence脱离了远程内存访问(RMA)操作要求,遵循MPI RMA数据访问规范。
图1-8所示的程序代码是采用单边通信方式实现图1-7中MPI_Reduce操作。注意图1-8所示的程序并非对图1-7中程序的完整替换,只是用来介绍单边通信方式。通过使用单边通信方式,可异步更新进程中数据,甚至一个进程可以多次更新数据,但是该实现方式有潜在的并行规模可扩展性问题。
MPI提供的第二种单边通信完成方式相对于MPI_Win_fence方式更加通用,称之为可扩展规模的同步方式,例如MPI_Win_post、MPI_Win_start、MPI_Win_complete和MPI_Win_wait函数。首先,通过这些函数指定MPI数据窗口、单边通信的源进程和目标进程。因为这些函数不需要在通信域的所有进程上使用阻塞式同步方式,因此并行规模是可扩展的。无论是MPI_Win_fence同步方式,还是MPI_Win_post等可扩展规模的同步方式,均需要在源进程和目标进程上采用同步操作,因为这两种方法均为主动目标同步方式。

screenshot

MPI提供的第三种单边通信完成方式只需通过源进程进行函数调用即可,称之为被动目标同步,如图1-9程序示例所示。其中,0号进程在while循环中不执行任何MPI函数。通过调用MPI_Win_lock和MPI_Win_unlock函数确保完成源进程和目标进程上数据的MPI RMA操作。MPI_Win_lockall和MPI_Win_unlockall函数允许一个进程在内存窗口中对其他所有进程上的数据执行RMA操作。同时,MPI_Win_flush函数也可用于被动目标同步,实现对目标进程的RMA操作。MPI也提供返回MPI_Request对象的读、写、更新三种类型的操作函数。用户可使用MPI_Test或MPI_Wait函数检查本地操作完成情况,无需等待下一个RMA同步调用操作。

screenshot

以下细节需要注意,0号进程在访问MPI窗口中本地数据前也需要调用MPI_Win_lock函数。通过调用MPI_Win_lock函数,确保所有在目标进程上挂起的内存操作均被执行。这是共享和远程内存访问编程模型中需要格外注意的细节,且经常被编程者误解的地方(详见[45]使用共享内存模型编程的常见错误示例)。MPI定义的内存模型可确保用户得到连续和正确的数据,即使在无法实现高速缓存一致性的计算机系统上也可正常工作。在MPI-2定义出现的时期,世界上最快的计算机系统支持高速缓存一致性,但未来的高性能计算系统可能不完全支持高速缓存一致性。MPI既提供满足单边通信的内存准确性最低要求的基本函数外,还提供要求更加严格的函数,从而保证MPI程序能够在大多数计算机系统上运行。MPI-3在现有内存访问模型的基础上,增加了“统一内存模型”,现在称之为“分布式内存模型”。用户可通过MPI_Win_get_attr函数得知计算机系统是否支持“统一内存模型”,若系统支持该模型,则通过使用该模型将极大简化内存一致性方面操作。
MPI-3在MPI-2的基础上,极大地丰富了单边通信的操作函数,解决MPI-2函数中存在的问题,使MPI RMA的应用更加广泛,并提高单边通信的可移植性和性能。例如,MPI-3提供支持在许多并行算法中常用的原子读、写和修改操作,例如MPI_Fetch_and_op函数实现读取和增加功能,MPI_Compare_and_swap实现比较和交换功能。同时,MPI-3能够创建共享内存窗口,在RMA操作基础上增加了内存直接存储访问功能。如果用户需要使用RMA 编程,建议了解MPI-3中增加的新特性。

相关文章
|
并行计算 异构计算
CUDA stream利用CUDA流重叠计
CUDA stream利用CUDA流重叠计
1314 0
CUDA stream利用CUDA流重叠计
|
4月前
|
人工智能 运维 监控
Hermes Agent 阿里云部署手册 2026完整流程、参数配置与Token管控方案
Hermes Agent 是一款面向AI智能体场景的调度与执行框架,具备多模型对接、任务流编排、会话管理、插件扩展等能力,常被部署在阿里云云服务器、函数计算等云资源之上,用于构建私有化AI服务、企业内部智能办公系统、自动化任务集群。2026年,随着AI智能体在云端落地场景不断增多,大量开发者与企业运维人员选择在阿里云环境中搭建Hermes Agent服务。
515 0
|
6月前
|
Java
Abaqus 2026 安装教程:JDK配置+汉化详解(64位)
Abaqus 2026 是一款专业非线性有限元分析软件,支持材料、几何及边界非线性问题。本教程详述离线安装全流程:含JDK21配置、License部署、CAE/Standard/Explicit模块安装、环境变量设置及简体中文界面启用,操作清晰、一步一图。(239字)
|
11月前
|
Kubernetes API 开发工具
深入浅出K8S技术原理,搞懂K8S?这一篇就够了!
本文以“K8S帝国”为喻,系统解析Kubernetes核心技术原理。从声明式API、架构设计到网络、存储、安全、运维生态,深入浅出揭示其自动化编排本质,展现K8S如何成为云时代分布式操作系统的基石。(239字)
4615 8
|
存储 安全 开发工具
App隐私合规评估实务和要点
随着移动互联网的高速发展及监管部门针对移动互联网应用程序(以下简称“App”)隐私合规监管趋严,特别是在个人信息保护法的实施下。本文将深入探讨App隐私合规评估的要点和难点,提供详细的信息,并提供一套轻量级和自动化的App隐私合规治理方案,降低App业务被通报和下架等合规风险,以保障企业App业务正常运营。
1952 0
|
人工智能 并行计算 程序员
【AI系统】SIMD & SIMT 与芯片架构
本文深入解析了SIMD(单指令多数据)与SIMT(单指令多线程)的计算本质及其在AI芯片中的应用,特别是NVIDIA CUDA如何实现这两种计算模式。SIMD通过单指令对多个数据进行操作,提高数据并行处理能力;而SIMT则在GPU上实现了多线程并行,每个线程独立执行相同指令,增强了灵活性和性能。文章详细探讨了两者的硬件结构、编程模型及硬件执行模型的区别与联系,为理解现代AI计算架构提供了理论基础。
4657 12
|
缓存 网络性能优化 SoC
ZYNQ-AXI_GP接口和AXI_HP接口的异同
ZYNQ-AXI_GP接口和AXI_HP接口的异同
2178 0
ZYNQ-AXI_GP接口和AXI_HP接口的异同
|
Java API Apache
Springboot+shiro,完整教程,带你学会shiro
这篇文章提供了一个完整的Apache Shiro与Spring Boot结合使用的教程,包括Shiro的配置、使用以及在非Web和Web环境中进行身份验证和授权的示例。
1061 2
Springboot+shiro,完整教程,带你学会shiro
|
网络协议 数据安全/隐私保护 网络架构
如何在家中使用手机或电脑远程控制公司iStoreOS软路由下的电脑桌面
如何在家中使用手机或电脑远程控制公司iStoreOS软路由下的电脑桌面
1160 4