我是 CUDA 编程的新手。我有一个 CUDA 子程序,希望它可以用一个简单的源对扩散方程进行建模:
attributes(global) subroutine diff_time_stepper(v,diffconst)
real*8 :: v(:,:)
real*8 :: diffconst
real*8 :: vintermed
integer :: i,j,m
integer :: nx, ny
nx=256
ny=256
i=(blockIdx%x-1)*blockDim%x+threadIdx%x
j=(blockIdx%y-1)*blockDim%y+threadIdx%y
if (i<nx .and. j<ny .and. i>1 .and. j>1) then
vintermed=v(i,j)+diffconst*(v(i-1,j)-2.*v(i,j)+v(i+1,j)+v(i,j-1)-2.*v(i,j)+v(i,j+1))
v(i,j)=vintermed
! add a source for the heck of it
if (i==64 .and. j==64) v(i,j)=v(i,j)+1
endif
end subroutine
我的问题:这个程序似乎有效,给出了合理的结果(即使运行速度没有我希望的那么快)。但是我这里有“向后依赖”吗?特别是,vinterm 由一个涉及多个 v 的函数设置,然后 v 设置为等于 vtinerm。然后在此计算之后设置 v(64,64)。这些是潜在的问题吗?更一般地说,即使我发现了很多关于如何为 CUDA 编程的讨论,但我发现关于后向依赖问题的讨论很少,这在我看来是最重要的。谁能指出我对此进行了很好的讨论?谢谢。