我以 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) 代码进行编译,它可以工作!
我该如何解决这个问题?