Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function CUDA FORTRAN:如果我传递变量而不是数字,函数会给出不同的答案_Function_Cuda_Fortran - Fatal编程技术网

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

Function CUDA FORTRAN:如果我传递变量而不是数字,函数会给出不同的答案,function,cuda,fortran,Function,Cuda,Fortran,我试图使用CUDA FORTRAN,使用ISHFT()函数并行地对一些32位整数进行位移位 问题是我对ISHFT(-4,-1)和ISHFT(var,-1)得到了不同的答案,即使var=-4。这是我编写的测试代码: module testshift integer :: test integer, device :: d_test contains attributes(global) subroutine testshft () integer :: var

我试图使用CUDA FORTRAN,使用
ISHFT()
函数并行地对一些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
如果工作正常,两者都应为2147483646。如果我用
4
替换
var
,我会得到正确的答案

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

当我从上述程序中删除GPU特定代码时,正如您所期望的,我从g95编译器中获得了2147483646 2147483646。您是否尝试过使用pgf90编译器运行“标量”版本的程序?如果标量版本有效,但GPU版本无效,则有助于隔离问题。如果问题是pgf90/CUDA特定的,那么最好的提问方式可能是

PGI用户论坛索引->编程和编译
.

当我从上述程序中删除特定于GPU的代码时,我从g95编译器中获得2147483646 2147483646,正如您所期望的那样。您是否尝试过使用pgf90编译器运行“标量”版本的程序?如果标量版本有效,但GPU版本无效,则有助于隔离问题。如果问题是pgf90/CUDA特定的,那么最好的提问方式可能是

PGI用户论坛索引->编程和编译
.

我找到了一个解决方法,发布在这个论坛上:

我使用IBITS代替ISHFT,如下所述:

此外,该问题已在PGI编译器的11.3版中修复

我找到了一个解决方法,发布在这个论坛上:

我使用IBITS代替ISHFT,如下所述:

此外,该问题已在PGI编译器的11.3版中修复

标量版本工作正常,我可以将变量传递到ISHFT()函数中,它给出了正确的答案。唯一不起作用的是将变量传递到GPU版本时。我在pgi用户论坛上问过一个类似的问题,但我担心我会被判重新发布的罪名成立。如果我尝试发布一个更简单的问题版本,就像在这里发布的一样。标量版本工作正常,我可以将一个变量传递到ISHFT()函数中,它会给我正确的答案。唯一不起作用的是将变量传递到GPU版本时。我在pgi用户论坛上问了一个类似的问题,但我担心如果我试图发布一个更简单的问题版本,比如在这里发布的问题,我会被判重新发布的罪名成立。嗯,你是否尝试过使用仿真模式跟踪问题,您是否尝试过使用仿真模式
–Mcuda=emu
跟踪问题?
pgf90 testishft.f90 -Mcuda
./a.out 
   2147483646           -2