加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

openmp中的Depend子句不尊重声??明的依赖

发布时间:2020-12-14 05:01:06 所属栏目:百科 来源:网络整理
导读:我正在尝试使用openmp任务来安排基本jacobi2d计算的平铺执行.在jacobi2d中,依赖于A(i,j) A(i,j) A(i-1,j) A(i 1,j) A(i,j-1) A(i,j 1). 根据我对depend子句的理解,我正确地声明了依赖关系,但是在执行代码时它们并没有被尊重.我复制了下面的简化代码片段.最初
我正在尝试使用openmp任务来安排基本jacobi2d计算的平铺执行.在jacobi2d中,依赖于A(i,j)

A(i,j)
A(i-1,j)
A(i 1,j)
A(i,j-1)
A(i,j 1).

根据我对depend子句的理解,我正确地声明了依赖关系,但是在执行代码时它们并没有被尊重.我复制了下面的简化代码片段.最初我的猜测是,某些磁贴的超出范围可能会导致此问题,所以我更正了但问题仍然存在.(我没有复制更长的代码和更正的磁贴范围,因为该部分只是一堆ifs max )

int n=8,tsteps=2,b=4;         //n - size of matrix,tsteps - time iterations,b - tile size or block size

#pragma omp parallel
{
#pragma omp master
for (t=0; t<tsteps; ++t)
  {
    for (i=0; i<n; i+=b)
      for (j=0; j<n; j+=b)
      {
        #pragma omp task firstprivate(t,i,j) depend(in:A[i-1:b+2][j-1:b+2]) depend(out:B[i:b][j:b])
        { 
          #pragma omp critical  
          printf("t-%d i-%d j-%d --A",t,j);     //Prints out time loop,j 
        }
      } 
    for (i=0; i<n; i+=b)
      for (j=0; j<n; j+=b)
      {
        #pragma omp task firstprivate(t,j) depend(in:B[i-1:b+2][j-1:b+2]) depend(out:A[i:b][j:b])
        {
          #pragma omp critical  
          printf("t-%d i-%d j-%d --B",j 
        }
      }
  }
}
}

因此,从i-1和j-1开始依赖并且范围为(b 2)的想法是相邻的tile也会影响当前的tile计算.并且类似地,对于第二组循环,其中A中的值应该仅在相邻区块使用该值时被重写.

代码正在使用支持openmp 4.0的gcc 5.3编译.

ps:上面声明的数组范围表示起始位置和创建依赖图时要考虑的索引数.

编辑(基于Zulan的评论) – 将内部代码更改为简单的print语句,因为这足以检查任务执行的顺序.理想情况下,对于上述值(因为只有4个图块),所有图块应该完成第一个printf,然后只执行第二个.但是如果你执行代码,它会混合订单.

解决方法

所以我终于找到了问题,尽管OpenMP规范说依赖子句应该用起点和范围来实现,但它还没有在gcc中实现.因此,目前它仅比较来自depend子句的起点(依赖(在:[[[1:1:b 2] [j-1:b 2]中))A [i-1] [j-1]在这种情况下.

最初我是在比较不同相对平铺位置的元素.例如,将(0,0)元素与瓦片的最后一个元素进行比较,这与依赖性没有冲突,因此执行各种任务的随机顺序.

当前的gcc实现根本不关心该子句中提供的范围.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读