完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本文调研了4篇与OpenMP优化相关的文献,对优化点分析如下: 面向Open64的OpenMP程序优化^[1]^跨越过程边界的并行区重构Open64有着过程间分析优化部件,因此可以知道哪些函数使用了被调函数,从而可以通过在使用被调函数处放置合适的编译指导语句来完成并行区重构。 这样做的好处是:
以下给出例子:
优化后:
OpenMP并行编程模型与性能优化方法的研究及应用^[2]^Cache命中率优化
循环调度优化在OpenMP中可对并行循环指定调度方案,以将每个迭代分配给多个工作线程执行。其一般形式如下:
OpenMP编译与优化技术研究^[3]^论文中给出了一种使用启发式规则来估计各种额外开销和调度参数的关系,得到一个线性不等式组,可以通过求解该不等式组得到较优的调度参数。 变量属性的优化在OpenMP语句中每一次对变量的声明都对应一次新的地址分配。给出以下例子:
在如上代码中,编译器会为每个循环分配一个单独的私有变量,而优化后的代码如下所示:
How to Get Good Performance by Using OpenMP^[4]^去除依赖对于某些循环语句,存在依赖而导致无法使用OpenMP优化,但是这其中的某些依赖可以通过修改代码去除依赖而使用OpenMP运行代码。 下列循环存在反依赖:
除去循环之间的依赖后:
下列循环存在流依赖:
在loop skewing之后:
负载不均衡下段代码使用流水线形式处理,以块的形式读取数据,然后处理每个块并在下一个块之前将结果写入磁盘,造成极差的负载均衡。
接下来这段代码使用动态调度来重叠I/O和处理数据,将上述流水线代码并行化。
解决伪共享问题
一般情况下,int型变量占四个字节,A[0]和A[1]的地址只差四个字节,小于一个Cache行,它们有着极大的可能在同一Cache行内,从而导致同时更新不同处理器的相同Cache行中的单个元素会导致整个Cache行无效。 对于False sharing问题,一般可以通过填充数组来优化。
我们还对文献中的部分优化使用LLVM Flang编译器和classic-flang编译器进行了测试,测试结果请参考https://gitee.com/src-openeuler/flang/pulls/22/files。 References
|
|
相关推荐 |
|
只有小组成员才能发言,加入小组>>
6个成员聚集在这个小组
加入小组Native Memory Tracking 详解(2):追踪区域分析(一)
17015 浏览 0 评论
15096 浏览 0 评论
16945 浏览 0 评论
15904 浏览 0 评论
openEuler 资源利用率提升之道 04:CPU 抢占和 SMT 隔离控制
22871 浏览 0 评论
openEuler社区开源项目:CPDS(容器故障检测系统)介绍
719浏览 0评论
1078浏览 0评论
1066浏览 0评论
1121浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 15:11 , Processed in 0.721195 second(s), Total 49, Slave 39 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号