我正在尝试将PGFortran用于CUDA。我在我的计算机上安装了PGFortran,并根据我的知识链接了所有内容。为了开始,我决定遵循教程listed here。在尝试编译代码时:
module mathOps
contains
attributes(global) subroutine saxpy(x, y, a)
implicit none
real :: x(:), y(:)
real, value :: a
integer :: i, n
n = size(x)
i = blockDim%x * (blockIdx%x - 1) + threadIdx%x
if (i <= n) y(i) = y(i) + a*x(i)
end subroutine saxpy
end module mathOps
program testSaxpy
use mathOps
use cudafor
implicit none
integer, parameter :: N = 40000
real :: x(N), y(N), a
real, device :: x_d(N), y_d(N)
type(dim3) :: grid, tBlock
tBlock = dim3(256,1,1)
grid = dim3(ceiling(real(N)/tBlock%x),1,1)
x = 1.0; y = 2.0; a = 2.0
x_d = x
y_d = y
call saxpy<<<grid, tblock="">>>(x_d, y_d, a)
y = y_d
write(*,*) 'Max error: ', maxval(abs(y-4.0))
end program testSaxpy
我得到了:
PGF90-S-0034-Syntax error at or near identifier saxpy (main.cuf: 29)
0 inform, 0 warnings, 1 severes, 0 fatal for testsaxpy
错误指向行call saxpy<<<grid, tblock="">>>(x_d, y_d, a)
。出于某种原因,它显然讨厌我使用<<<
和>>>
的事实?在教程中,那些三重V形符号应该存在:
三重V形之间的信息是执行 配置,指示有多少设备线程执行 内核并行。
删除这些V形符号没有任何意义,因为它们是程序的目的。那么为什么PGFortran不喜欢这个?
至于汇编。我已经按照教程使用了
pgf90 -o saxpy main.cuf
。但由于这给出了错误,我也尝试了pgf90 -Mcuda -o saxpy main.cuf
。相同的结果。
答案 0 :(得分:1)
在内核调用行的博客中似乎确实存在文本错误:
call saxpy<<<grid, tblock="">>>(x_d, y_d, a)
tblock=""
不正确。您将注意到该博客文本中的其他位置,内核调用行正确地给出为:
call saxpy<<<grid,tBlock>>>(x_d, y_d, a)
因此,如果您在实际代码中相应地更改该行,我认为您会有更好的结果。