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

Posted

技术标签:

【中文标题】CUDA FORTRAN:如果我传递变量而不是数字,函数会给出不同的答案【英文标题】:CUDA FORTRAN: function gives different answer if I pass variable instead of number 【发布时间】:2011-02-17 13:29:20 【问题描述】:

我正在尝试使用ISHFT() 函数来并行移位一些32 位整数,使用CUDA FORTRAN。

问题是我对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,我会得到正确答案。

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

【问题讨论】:

hmm,您是否尝试过使用模拟模式–Mcuda=emu跟踪问题? 【参考方案1】:

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

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

【讨论】:

标量版本工作正常,我可以将一个变量传递给 ISHFT() 函数,它给了我正确的答案。唯一不起作用的是将变量传递到 GPU 版本时。我在 pgi 用户论坛 pgroup.com/userforum/… 上问过一个类似的问题,但我担心如果我尝试发布类似此处发布的问题的更简单版本,我会因转发而被判有罪【参考方案2】:

我找到了一个解决方法,发布在此论坛中: 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

【讨论】:

以上是关于CUDA FORTRAN:如果我传递变量而不是数字,函数会给出不同的答案的主要内容,如果未能解决你的问题,请参考以下文章

将 Fortran 转换为 Javascript

Fortran 90 中是不是有更好的双精度赋值?

在 FORTRAN 子例程中传递不同的变量集

使用 Fortran 和 CUDA 计算 PI

即使在构建可执行文件时,CMake 3.0 + Fortran + CUDA也需要-fPIC

在 C++ 和 Fortran 代码之间传递复数数组