我正在尝试使用ISHFT()
函数使用CUDA FORTRAN并行对某些32位整数进行位移位。
问题是,即使ISHFT(-4,-1)
,我对ISHFT(var,-1)
和var = -4
的回答也不同。这是我编写的测试代码:
module testshift
integer :: test
integer, device :: d_test
contains
attributes(global) subroutine testshft ()
integer :: var
var = -4
d_test = ISHFT(var,-1)
end subroutine testshft
end module testshift
program foo
use testshift
integer :: i
call testshft<<<1,1>>>() ! carry out ishft on gpu
test = d_test ! copy device result to host
i = ISHFT(-4,-1) ! carry out ishft on cpu
print *, i, test ! print the results
end program foo
然后,我编译并执行:
pgf90 testishft.f90 -Mcuda
./a.out
2147483646 -2
如果正常工作,则两者都应为2147483646。如果将
var
替换为4
,我将得到正确的答案。我该如何解决这个问题?
谢谢您的帮助
最佳答案
当您从上述程序中删除GPU特定的代码时,正如您所期望的,我从g95编译器中获得了2147483646 2147483646。您是否尝试过使用pgf90编译器运行程序的“标量”版本?如果标量版本有效,但GPU版本无效,则有助于解决问题。如果问题是pgf90/CUDA特有的,也许最好的地方是
PGI用户论坛论坛索引->编程和编译
http://www.pgroup.com/userforum/viewforum.php?f=4。
关于function - CUDA FORTRAN : function gives different answer if I pass variable instead of number,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4947241/