0

我以 CUDA Fortran 的主机和设备之间的数据传输为例,发现:

主机代码:

program incTest  
    use cudafor
    use simpleOps_m
    implicit none
    integer, parameter :: n = 256
    integer :: a(n), b, i
    integer, device :: a_d(n)
    a = 1
    b = 3
    a_d = a
    call inc<<<1,n>>>(a_d, b)
    a = a_d
    if (all(a == 4)) then
        write(*,*) 'Success'
    endif
end program incTest

设备代码:

module simpleOps_m
contains
    attributes(global) subroutine inc(a, b)
        implicit none
        integer :: a(:)
        integer, value :: b
        integer :: i
        i = threadIdx%x
        a(i) = a(i)+b
    end subroutine inc
end module simpleOps_m

预期的结果是控制台显示“成功”,但这并没有发生。屏幕上什么也没有出现,没有任何错误或消息。发生这种情况是因为不要输入 if,因为 a_d 与调用 inc 子程序之前的值相同。

我正在使用:

操作系统:Linux - Ubuntu 16

库达 8

PGI 编译

编译命令:

pgf90 -Mcuda -c Device.cuf
pgf90 -Mcuda -c Host.cuf
pgf90 -Mcuda -o HostDevice Device.o Host.o
./HostDevice

我尝试了其他示例,但它们也不起作用。

我尝试使用具有相同命令的简单 Fortran (.f90) 代码进行编译,它可以工作!

我该如何解决这个问题?

4

1 回答 1

1

您使用的是什么类型的设备?(如果您不知道,请发布“pgaccelinfo”实用程序的输出)。

我最好的猜测是您有一个基于 Pascal 的设备,在这种情况下您需要使用“-Mcuda=cc60”进行编译。

例如,如果我在示例代码中添加错误检查,我们会看到在没有“cc60”作为编译一部分的 Pascal 上运行时,我们会收到一个无效的设备内核错误。

% cat test.cuf 
 module simpleOps_m 
      contains 
          attributes(global) subroutine inc(a, b) 
              implicit none 
              integer :: a(:) 
              integer, value :: b 
              integer :: i 
              i = threadIdx%x 
              a(i) = a(i)+b 
          end subroutine inc 
  end module simpleOps_m 

 program incTest 
          use cudafor 
          use simpleOps_m 
          implicit none 
          integer, parameter :: n = 256 
          integer :: a(n), b, i, istat 
          integer, device :: a_d(n) 
          a = 1 
          b = 3 
          a_d = a 
          call inc<<<1,n>>>(a_d, b) 
          istat=cudaDeviceSynchronize() 
          istat=cudaGetLastError() 
          a = a_d 
          if (all(a == 4)) then 
              write(*,*) 'Success' 
          else 
              write(*,*) 'Error code:', cudaGetErrorString(istat) 
          endif 
  end program incTest 
 % pgf90 test.cuf -Mcuda 
 % a.out 
  Error code: 
  invalid device function                                                        
 % pgf90 test.cuf -Mcuda=cc60 
 % a.out 
  Success 
于 2017-04-11T18:41:05.980 回答