我正在尝试使用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中的值应该仅在相邻区块使用该值时被重写.
ps:上面声明的数组范围表示起始位置和创建依赖图时要考虑的索引数.
编辑(基于Zulan的评论) – 将内部代码更改为简单的print语句,因为这足以检查任务执行的顺序.理想情况下,对于上述值(因为只有4个图块),所有图块应该完成第一个printf,然后只执行第二个.但是如果你执行代码,它会混合订单.
解决方法
@H_502_42@
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。