【发布时间】:2019-08-15 21:14:41
【问题描述】:
我正在尝试将工作人员私有数组与 OpenACC 一起使用,但我一直得到错误的结果。我想有一些比赛条件问题正在发生,但我找不到在哪里。
我正在使用 PGI 编译器(18.10,OpenPower)并编译:
pgf90 -gopt -O3 -Minfo=all -Mcuda=ptxinfo -acc -ta=tesla:cc35 main.F90
这是我想要实现的一个最小示例:
#define lx 7000
#define ly 500
program test
implicit none
integer :: tmp(ly,1), a(lx,ly), b(lx,ly)
integer :: x,y,i
do x=1,lx
do y=1,ly
a(x,y) = x+y
end do
end do
!$acc parallel num_gangs(1)
!$acc loop worker private(tmp)
do x=1,lx
!$acc loop vector
do y=1,ly
tmp(y,1) = -a(x,y)
end do
!$acc loop vector
do y=1,ly
b(x,y) = -tmp(y,1)
end do
end do
!$acc end parallel
print *, "check"
do x=1,lx
do y=1,ly
if(b(x,y) /= x+y) print *, x, y, b(x,y), x+y
end do
end do
print*, "end"
end program
我的预期是得到 b == a,但事实并非如此。
请注意,我定义了tmp(ly,1),因为当我将tmp(ly) 定义为一维数组时,我得到了预期的结果。即使它适用于一维数组,我也不确定它是否完全遵守 OpenACC 标准。
我错过了什么吗?
编辑:最后一个循环检查是否 a==b 并打印错误的值。预期的输出(我在禁用 OpenACC 的情况下得到)是:
check
end
启用 OpenACC 后我得到的结果是这样的(运行之间的变化):
check
1 1 5 2
1 2 6 3
1 3 7 4
[...]
end
【问题讨论】: