Fortran不了解call语句

时间:2014-04-14 02:55:49

标签: cuda fortran

我正在尝试将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。相同的结果。

1 个答案:

答案 0 :(得分:1)

在内核调用行的博客中似乎确实存在文本错误:

call saxpy<<<grid, tblock="">>>(x_d, y_d, a)

tblock=""不正确。您将注意到该博客文本中的其他位置,内核调用行正确地给出为:

call saxpy<<<grid,tBlock>>>(x_d, y_d, a)

因此,如果您在实际代码中相应地更改该行,我认为您会有更好的结果。