《并行计算的编程模型》一2.6.3 AM Ping-Pong示例

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

2.6.3 AM Ping-Pong示例

虽然“Hello,World!”示例已经演示了每个GASNet应用程序开始结束所需的基础内容,但是除了屏障中隐含的内容外,该示例没有执行任何通信。因此,接下来我们展示了一个简单的使用GASNet的AM在节点对间执行“Ping-Pong”通信的例子。
screenshot

screenshot

该示例的第一部分如代码清单2-2所示,表示的是必需的AM处理程序。该代码在“Hello,World!”示例的框架中替换了第19行。此例中包括两个AM处理程序,其中每个AM处理程序都需要一个带单个参数的Short AM。“Ping”处理程序在响应AM请求时运行且只执行以下两个操作:打印带参的消息和发出AM Reply以调用参数相同的“Pong”处理程序。“Pong”处理程序主要负责打印不同的消息并递增计数器值。其中计数器通过使用GASNet工具的原子增量实现,以确保线程安全(计数器也是从main()中读取)。或者也可以使用pong_counter++,但需要HSL的保护。
本例的第二部分是main()函数逻辑,如代码清单2-3所示。在“Hello,World!”示例的框架中,该代码可以替换第32~34行。其中第3行的代码默认为2次迭代,但如果提供其他数字,它将从命令行中获取备选值。第6~7行的代码主要用于节点配对(0和1、2和3等),若节点数为奇数,那么将在最后一个节点上自身配对。示例的核心代码从第10行开始。每个节点对中编号较小的节点进行循环计数(count)迭代,并向另一个节点发送AM Request,然后阻塞直到对方的AM Reply增加了pong_count原子变量值。与此同时,节点对中编号较大的节点不在main()中执行相关工作,且在第20~21行调用屏障函数。节点对中的双方都必须运行AM才能保证示例正确执行。因此,偶数节点通过使用GASNET_BLOCKUNTIL等待“Pong”非常重要。如果代码改为如下的方式,则没有异步进程线程的GASNet实现将会产生死锁。
screenshot

如果在没有附加命令行参数的3个节点上运行上述示例,输出结果如下所示。三个节点的输出结果按照时间顺序交织在一起打印到屏幕上。
screenshot

相关文章
|
存储 Rust 自然语言处理
C代码演示WebAssembly工作流程
【2月更文挑战第3天】 工作流程: * C 代码使用 Emssripten 工具编译为 wasm 后缀的二进制文件,同时可以生成访问wasm的js胶水代码和html代码 * wasm后缀的二进制格式文件的文本表示方式为后缀为wat格式的文本文件,方便在编辑器和浏览器开发者工具中查看 * 可以使用wabt工具将wat格式的文本文件直接打包成wasm的二进制文件 * 使用WebAssemblyJavascriptAPI发起对wasm的调用 * 编写胶水代码 * 使用fetch/xhr获取wasm * 借助胶水代码访问wasm中的函数
525 0
|
Linux 编译器 Shell
深入理解Linux中的动态库与静态库
深入理解Linux中的动态库与静态库
|
11月前
|
机器学习/深度学习 人工智能 数据可视化
生成AI的两大范式:扩散模型与Flow Matching的理论基础与技术比较
本文系统对比了扩散模型与Flow Matching两种生成模型技术。扩散模型通过逐步添加噪声再逆转过程生成数据,类比为沙堡的侵蚀与重建;Flow Matching构建分布间连续路径的速度场,如同矢量导航系统。两者在数学原理、训练动态及应用上各有优劣:扩散模型适合复杂数据,Flow Matching采样效率更高。文章结合实例解析两者的差异与联系,并探讨其在图像、音频等领域的实际应用,为生成建模提供了全面视角。
2241 1
生成AI的两大范式:扩散模型与Flow Matching的理论基础与技术比较
|
开发工具 开发者 git
「Mac畅玩鸿蒙与硬件4」鸿蒙开发环境配置篇4 - DevEco Studio高效使用技巧
本篇将进一步介绍如何在 DevEco Studio 中高效使用各种功能,通过掌握快捷键、代码补全、调试工具等,帮助开发者在鸿蒙应用开发中大幅提升工作效率。
707 1
「Mac畅玩鸿蒙与硬件4」鸿蒙开发环境配置篇4 - DevEco Studio高效使用技巧
|
机器学习/深度学习 数据可视化 算法
YOLOv9改进目录一览 | 涉及卷积层、轻量化、注意力、损失函数、Backbone、SPPF、Neck、检测头等全方位改进
YOLOv9改进目录一览 | 涉及卷积层、轻量化、注意力、损失函数、Backbone、SPPF、Neck、检测头等全方位改进
949 5
YOLOv9改进目录一览 | 涉及卷积层、轻量化、注意力、损失函数、Backbone、SPPF、Neck、检测头等全方位改进
|
缓存 数据处理 UED
【Uniapp 专栏】Uniapp 开发中的疑难问题解决与进阶策略
【5月更文挑战第17天】在 Uniapp 开发中,解决页面间数据传递、网络请求异常、屏幕适配及性能优化等问题至关重要。利用路由参数传递复杂数据,如`uni.navigateTo`和`JSON.stringify`;处理网络请求异常时,添加错误处理机制增强健壮性;使用响应式设计和缓存策略优化布局和性能。针对组件问题,需排查依赖和配置,而平台差异则需定制化处理。通过不断学习和实践,提升开发技能,确保项目成功实施。
406 2
【Uniapp 专栏】Uniapp 开发中的疑难问题解决与进阶策略
|
测试技术 持续交付 开发工具
掌握 Git 钩子:提升代码质量和团队协作效率
在软件开发中,保证代码质量和团队协作至关重要。Git 钩子通过在特定操作(如提交、推送)时自动执行脚本,增强了代码审查、自动化测试和持续集成。常见钩子类型包括 `pre-commit`、`post-commit`、`pre-push` 和 `post-receive`。通过配置这些钩子,开发者可以实现代码风格检查、自动化测试和自动部署等任务,从而提升代码质量和团队协作效率。例如,`pre-commit` 钩子可用于运行 ESLint 检查 JavaScript 代码风格,确保每次提交都符合编码规范。
|
Linux
Linux 修改服务器时间
【10月更文挑战第27天】Linux 修改服务器时间
2774 0
|
自然语言处理 算法 物联网
如何训练一个大模型:LoRA篇
如何训练一个大模型:LoRA篇
3390 1
|
算法 安全 网络安全
HTTPS 的加密流程详解
详细介绍HTTPS是如何建立连接的