CUDA FORTRAN:如果我传递变量而不是数字,函数会给出不同的答案

时间:2011-02-17 13:29:21

标签: function cuda fortran

我正在尝试使用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,我会得到正确答案。

如何解决此问题? 谢谢你的帮助

2 个答案:

答案 0 :(得分:1)

当我从上面的程序中删除GPU特定的代码时,我从g95编译器得到2147483646 2147483646,正如您所期望的那样。您是否尝试使用pgf90编译器运行程序的“标量”版本?如果标量版本有效但GPU版本不起作用,则有助于隔离问题。如果问题是pgf90 / CUDA具体,也许是提出问题的最佳地点

PGI用户论坛论坛索引 - &gt;编程和编译 http://www.pgroup.com/userforum/viewforum.php?f=4

答案 1 :(得分:0)

我找到了一个解决方法,发布在这个论坛中: http://www.pgroup.com/userforum/viewtopic.php?t=2455&postdays=0&postorder=asc&start=15

我没有使用ISHFT而是使用IBITS,这里描述了http://gcc.gnu.org/onlinedocs/gfortran/IBITS.html

此外,该问题已在PGI编译器的版本11.3中得到修复 http://www.pgroup.com/support/release_tprs_2011.htm