gpt4 book ai didi

openmp - openmp 中的 Dependent 子句不尊重声​​明的依赖

转载 作者:行者123 更新时间:2023-12-04 21:36:39 27 4
gpt4 key购买 nike

我正在尝试使用 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 +最大限度)

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,i,j); //Prints out time loop, i,j
}
}
for (i=0; i<n; i+=b)
for (j=0; j<n; j+=b)
{
#pragma omp task firstprivate(t,i,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",t,i,j); //Prints out time loop, i,j
}
}
}
}
}

因此,声明从 i-1 和 j-1 开始并且范围为 (b+2) 的依赖关系的想法是相邻的图块也会影响您当前的图块计算。与第二组循环类似,其中 A 中的值仅应在相邻图块使用这些值后才被覆盖。

代码使用支持 openmp 4.0 的 gcc 5.3 编译。

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

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

最佳答案

所以我终于弄清楚了这个问题,尽管 OpenMP 规范说依赖子句应该用一个起点和范围来实现,但它尚未在 gcc 中实现。所以目前它只比较依赖子句的起点 (depend(in:A[i-1:b+2][j-1:b+2])) A[i-1][j-1] in这个案例。

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

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

关于openmp - openmp 中的 Dependent 子句不尊重声​​明的依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36322638/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com