function - CUDA FORTRAN : function gives different answer if I pass variable instead of number

标签 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,我将得到正确的答案。

我该如何解决这个问题?
谢谢您的帮助

最佳答案

当您从上述程序中删除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/

相关文章:

澄清调用内核中函数的需要

swift - 在将另一个方法作为参数传递的方法中,为什么 passes 参数不需要传递其参数?

c++ - CudaMalloc 抛出 sigabrt 错误

matlab - 随机森林代码审查

ios - 如何交叉编译 GCC 以生成适用于 iOS 设备(arm、armv7)的 libgfortran?

编写多个函数的 Pythonic 方式?

c++ - 使用 cuda cuFFT 从复数转换为实数时输出不正确

c - 处理器的 Gigaflops

c++ - 将 char 数组从 C++ 传递到 Fortran

r - 使用For循环对不同的链接进行层次聚类