《OpenACC并行程序设计:性能优化实践指南》一 1.6 控制并行资源

简介: 本节书摘来自华章出版社《OpenACC并行程序设计:性能优化实践指南》一 书中的第1章,第1.6节,作者:[美] 罗布·法伯(Rob Farber),更多章节内容可以访问云栖社区“华章计算机”公众号查看。

1.6 控制并行资源

accParaCounter.cpp中的嵌套循环结构可以用来控制循环并行性,因此可以控制并行资源消耗。
大多数并行编程人员遵循在系统中利用最大并行性来实现最高性能的方法。
大量线程背后的思路是给予并行调度器尽可能多的线程以供调度,从而最大化地利用所有计算资源。GPU编程人员喜欢用占有率(occupancy)作为线程并行度的度量。高占有率意味着调度器有更多的激活线程以供调用,因此有机会实现更高性能。
高占有率并不一定转为最快的应用性能。指令级并行(Instruction level parallelism,ILP)通过较少的线程来保持处理器(或GPU)忙碌以隐藏线程等待时间,线程数越少,消耗的资源和开销越少。指令级并行同样可以获得高性能。但是,编程人员必须安排好计算以确保最好地使用并行硬件。使用ILP的原因简单却有效:使用较少的线程意味着每个线程可以使用更多的资源(Volkov, 2010)。
这个结论同样适用于OpenACC,用来控制并行资源的使用。不同于OpenMP,OpenACC不提供类似omp_get_thread_num()机制来确定线程的身份,也不提供类似omp_get_num_thread()机制来找出并发线程总数。因此,无法写出可以控制其并行资源使用的类。相反,至少OpenACC 2.5规范中,OpenACC开发人员必须使用嵌套循环结构来显式控制在其程序中如何使用并行资源。
例如,程序accParaRNG.cpp并行地利用多个顺序随机数生成器。为了成功执行,程序必须保证同时只有一个线程使用随机数生成器。否则的话,内部更新的随机数生成器状态信息可能会损坏。不能用单个原子操作来更新种子区域,在OpenACC中唯一确保正确的操作是使用一个嵌套循环集。
如图1-23和1-24所示,accParaNRG.cpp代码使用任务并行和本章讨论的OpenACC构建,以及带进位乘法(multiply-with-carry, MWC)随机数生成器。George Marsaglia发明了MWC随机数生成器,基于从两个到数千个随机选择的种子值的初始集合来生成随机整数序列(Marsaglia & Zaman,1991)。MWC方法的主要优势是可以用少量C++代码实现,并且只有整数运算。MWC仍然主导快速生成随机数序列。读者可以用其他更精细的随机数生成器来替换accParaNRG.cpp中的算法,例如广泛使用的梅森绞扭器(Matsumoto & Nishinura, 1998)和Dieharder随机数测试套件(Brown, 2016)。

screenshot

screenshot

screenshot

screenshot

组合图1-23和图1-24中的代码,放到accParaRNG.cpp中。编译accParaRNG.cpp成PGI统一的二进制,在CPU和GPU上的测试结果如图1-25所示:

screenshot

相关文章
|
Kubernetes 负载均衡 网络协议
k8s学习-Service(概念、模板、创建、外部代理、删除等)
k8s学习-Service(概念、模板、创建、外部代理、删除等)
724 0
|
供应链 监控 数据可视化
智能库存方案:直击日常管理痛点,释放效益潜能
Leangoo 通过智能化仓储管理和智慧管理理念,解决了库存管理中常见的盘点繁琐、出入库混乱、补货滞后等问题。它提供精准的任务规划、可视化流程管理及智能预警系统,有效提升了库存管理的效率和准确性,促进了跨部门协作与沟通,开启了库存管理的新篇章。
1130 5
|
JavaScript API 开发者
深入理解Node.js中的事件循环和异步编程
【10月更文挑战第41天】本文将通过浅显易懂的语言,带领读者探索Node.js背后的核心机制之一——事件循环。我们将从一个简单的故事开始,逐步揭示事件循环的奥秘,并通过实际代码示例展示如何在Node.js中利用这一特性进行高效的异步编程。无论你是初学者还是有经验的开发者,这篇文章都能让你对Node.js有更深刻的认识。
|
Ubuntu Unix Shell
sh执行脚本报错Syntax error: “(“ unexpected ​的两种解决办法
​sh执行脚本报错Syntax error: “(“ unexpected ​的两种解决办法
|
网络安全 Windows 容器
5-16|OSError: [WinError 193] %1 不是有效的 Win32 应用程序。
5-16|OSError: [WinError 193] %1 不是有效的 Win32 应用程序。
|
人工智能 前端开发 算法
TopView.ai 技术栈
`Topview.ai` 是一个集成AI的视频编辑平台,利用OpenAI的GPT 4.0V和Gemini算法提供服务。其网站基于前沿的前端框架`Next.js`和`React`构建,后端基础设施依托于`AWS`云服务。[AI Video Editor](https://www.topview.ai)结合先进技术和用户友好的界面,为创意工作流程赋能。
|
消息中间件 NoSQL 关系型数据库
一文彻底搞定Redis与MySQL的数据同步
【10月更文挑战第21天】本文介绍了 Redis 与 MySQL 数据同步的原因及实现方式。同步的主要目的是为了优化性能和保持数据一致性。实现方式包括基于数据库触发器、应用层双写和使用消息队列。每种方式都有其优缺点,需根据具体场景选择合适的方法。此外,文章还强调了数据同步时需要注意的数据一致性、性能优化和异常处理等问题。
2798 0
|
数据采集 Web App开发 数据处理
一步步教你用Python Selenium抓取动态网页任意行数据
使用Python Selenium爬取动态网页,结合代理IP提升抓取效率。安装Selenium,配置代理(如亿牛云),设置User-Agent和Cookies以模拟用户行为。示例代码展示如何使用XPath提取表格数据,处理异常,并通过隐式等待确保页面加载完成。代理、模拟浏览器行为和正确配置增强爬虫性能和成功率。
2027 3
一步步教你用Python Selenium抓取动态网页任意行数据
|
小程序 前端开发 测试技术
微信小程序|ssm基于微信小程序的高校课堂教学管理系统
微信小程序|ssm基于微信小程序的高校课堂教学管理系统
300 1
【免费资料】IEEE33节点系统参数及拓扑图visio
初学者入门配电网可参考经典的IEEE 33节点系统,此系统在文献中广泛应用。资源包括节点和支路参数的Excel表格及Visio的网络拓扑图,可免费下载。配电网以闭环设计增强灵活性和可靠性,故障恢复涉及网络拓扑约束。提供的MATLAB相关链接探讨了孤岛、重构及故障恢复策略。