0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一些对OpenMP进行优化的方法

openEuler 来源:毕昇编译 作者:谢依晖 2022-10-18 09:44 次阅读

作者介绍

谢依晖

湖南大学硕士研究生在读,

本科毕业于湖南大学计算机科学与技术专业

Abstract

本文调研了一些对OpenMP进行优化的方法:

H. Ma, R. Zhao, X. Gao and Y. Zhang针对OpenMP程序中的barrier提出几种新功能的支持和性能的优化[1];

在SC20的Booth Talks上,Johannes Doerfert分享了在LLVM上对OpenMP做的一些优化[2]。

Barrier Optimization for OpenMP Program[1]

删除冗余的barrier

通过并行数据流分析,两个循环之间无数据依赖,所以S1的barrier是冗余的;parallel结束的时候有一个隐式的barrier,所以S2的barrier也是冗余的。

!$ompparallel
!$ompdo
doi=1,100
a(i)=d(i)
enddo!barrierS1
!$ompenddo
!$ompdo
doi=1,100
b(i)=c(i)
enddo!barrierS2
!$ompenddo
!$ompendparallel

优化时,可以在该语句块加上显式的nowait(!$omp end do nowait)。

实现DOACROSS并行

当并行化循环的时候,如果循环依赖距离是一个常数,如下代码:

doi=2,100
doj=2,100
a(i,j)=a(i-1,j)+a(i,j-1)
enddo
enddo

对外层循环i进行数据依赖检查,可以得到a[i][j]和a[i-1][j]之间的依赖距离为1。因此循环可以以DOACROSS并行的方式运行。OpenMP只实现了DOALL并行,没有与DOACROSS对应的语句。

实现时,定义共享数组“_mylocks [ threadid ]”来存储每个线程的事件,定义私有变量_counter0指示当前线程正在等待的事件。数组“_mylocks”中的元素总数是线程数,每个元素表示相应线程的当前状态。实现的代码如下:

int_mylocks[256];//thread'ssynchronizedarray
#pragmaompparallel
{
int_counter0=l;
int_my_id=omp_get_thread_num();
int_my_nprocs=omp_get_num_threads();
_mylocks[my_id]= 0;
for (j_tile=0;j_tile< N - l; j_tile += M) {
    if (_my_id >0){
do{
#pragmaompflush(_mylock)
}while(_mylock[myid-l]< _counter0);
      #pragma omp flush(a, _mylock)
      _counter0 +=1;
    }
    #pragma omp for nowait
    for (i = l; i < N; i++) {
      for (j = j_tile; j < j_tile + M; j++){
        a[i][j] = a[i - 1][j] + a[i][j - 1];
      }
    }
    _mylock[myid] += 1;
    #pragma omp flush(a, _mylock)
  }
}

Region Barrier

当线程遇到region barrier时会继续执行。但是直到其他所有线程都进入这个区域之后,它才能运行出该区域。这样的好处是允许线程继续运行而不空转,可以实现CPU的负载均衡。

region barrier的实现代码如下:

unsigned_counter=0;
#pragmaompparallel
{
{firstparallelregion}
#pragmaompatomic
_counter++;
{barrierregion}
#pragmaompflush(counter)
while(counter%omp_get_num_threads())
{
#pragmaompflush(counter)
}
#pragmaompflush
{thirdparallelregion}
}

当使用region barrier时,需要保证并行域R1和R3与并行域R2无依赖关系。

OpenMP SC20 Booth Talk Series : OpenMP compiler optimizations in LLVM [2]

OpenMP运行时调用重复数据的消除

double*A=malloc(size*omp_get_thread_limit());
double*B=malloc(size*omp_get_thread_limit());
#pragmaompparallel
do_work(&A[omp_get_thread_num()*size]);
#pragmaompparallel
do_work(&B[omp_get_thread_num()*size]);

示例代码中重复调用了omp_get_thread_limit()和omp_get_thread_num()函数,可以将重复调用合并至一次调用。该功能已在LLVM实现,可通过如下编译选项进行优化:

$clangdeduplicate.c-g-O2-fopenmp-Rpass=openmp-opt

Tracking OpenMP Internal Control Variables

voidfoo(){
#pragmaompparallel
bar();
}
voidbar(){
if(omp_in_parallel()){
...
}else{
...
}
}

以上代码,如果omp_in_parallel()的返回值可以判断为真,那么这个if结构就可以被删除。

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 优化
    +关注

    关注

    0

    文章

    220

    浏览量

    23887
  • OpenMP
    +关注

    关注

    0

    文章

    12

    浏览量

    5613
  • abstract
    +关注

    关注

    0

    文章

    4

    浏览量

    1666

原文标题:OpenMP优化调研系列文章(1)

文章出处:【微信号:openEulercommunity,微信公众号:openEuler】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    关于一些OpenMP优化的方式

    本文调研了一些OpenMP优化的方式。
    发表于 11-22 09:36 1103次阅读

    求分享一些关于优化示波器测量的提示与技巧

    求分享一些关于优化示波器测量的提示与技巧
    发表于 05-12 06:26

    关于java性能优化一些细节

    代码优化个很重要的课题。可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼样,它吃
    发表于 10-11 09:23

    openmp的相关资料下载

    嵌入式算法移植优化学习笔记1——openmp参考:1、https://www.oschina.net/p/openmp?hmsr=aladdin1e11、openmp简介
    发表于 12-14 09:03

    请问JPEG编码如何并行优化

    使用QT对Jpeg编码与解码功能进行优化,可以使用openmp,neon等各种方法
    发表于 05-16 21:25

    OpenMP优化调研系列文章(1)

    Abstract本文调研了一些OpenMP进行优化方法:H. Ma, R. Zhao, X. Gao and Y. Zhang针对
    发表于 10-28 10:18

    OpenMP优化调研系列文章(3)

    极大大小的数组,要在Cache中次容纳整个数组是有困难的,但可以将数组分为多块,可有效降低Cache失效率。循环调度优化OpenMP中可对并行循环指定调度方案,以将每个迭代分配给多个工作线程执行
    发表于 12-23 16:05

    一些在文本数据量不够大的时候可用的一些实用方法

    在这篇文章中,我将展示一些由我自己开发或是我在文章、博客、论坛、Kaggle和其他一些地方发现的方法,看看它们是如何在没有大数据的情况下让深度学习更好地完成我的任务的。其中许多方法都基
    的头像 发表于 11-19 17:39 6749次阅读
    <b class='flag-5'>一些</b>在文本数据量不够大的时候可用的<b class='flag-5'>一些</b>实用<b class='flag-5'>方法</b>

    5G网络优化一些案例资料下载

    电子发烧友网为你提供5G网络优化一些案例资料下载的电子资料下载,更有其他相关的电路图、源代码、课件教程、中文资料、英文资料、参考设计、用户指南、解决方案等资料,希望可以帮助到广大的电子工程师们。
    发表于 04-28 08:45 14次下载
    5G网络<b class='flag-5'>优化</b>的<b class='flag-5'>一些</b>案例资料下载

    Zigbee 3.0网络优化一些方法和建议

    本则实操演示视频中,Silicon Labs(亦称“芯科科技”)高级硬件应用工程师Jason Hou介绍了Zigbee 3.0网络优化一些方法和建议来帮助开发人员快速搭建稳定的Zigbee3.0
    的头像 发表于 06-18 18:17 2871次阅读

    嵌入式linux系统快速启动优化一些方法

    嵌入式linux快速启动的一些优化方法,主要是要掌握嵌入式linux系统的启动流程,以便能够在优化时有所指引。下面是一些总结:嵌入式lin
    发表于 11-01 17:06 8次下载
    嵌入式linux系统快速启动<b class='flag-5'>优化</b>的<b class='flag-5'>一些</b><b class='flag-5'>方法</b>

    NEON编程中的一些常见优化技巧

      读过上篇文章“ARM NEON快速上手指南”之后,相信你已经对ARM NEON编程有了基本的认识。但在真正利用ARM NEON优化程序性能时,还有很多编程技巧和注意事项。本文将结合本人的一些开发经历,介绍NEON编程中的
    的头像 发表于 12-12 09:11 1974次阅读

    分享一些Python代码加速工具

    这篇文章会提供一些优化代码的工具。会让代码变得更简洁,或者更迅速。
    发表于 07-07 11:18 385次阅读

    介绍得物App在资源优化上做的一些实践

    包体积优化中,资源优化般都是首要且容易有成效的优化方向。资源优化是通过优化APK中的资源项来
    的头像 发表于 07-24 09:00 756次阅读
    介绍得物App在资源<b class='flag-5'>优化</b>上做的<b class='flag-5'>一些</b>实践

    单片机“低耦合”的一些方法

    单片机“低耦合”的一些方法
    的头像 发表于 10-17 18:30 491次阅读