私は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のプログラミング方法について多くの議論を見つけましたが、この後方依存の問題についてはほとんど議論を見つけていません。これは私にとって最も重要だと思われます。誰かが私にこれについての良い議論を指摘できますか?ありがとう。