2011-02-17 66 views
1

我试图用ISHFT()函数来使用CUDA FORTRAN并行地移位一些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,如果工作正常。如果我用4代替var,我会得到正确的答案。

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

+0

嗯,你有没有试过使用仿真模式追踪问题'-Mcuda = emu`? – steabert 2011-03-22 10:55:32

回答

1

当我从上述程序中删除特定于GPU的代码时,我会从g95编译器中获得2147483646 2147483646,如您所愿。您是否曾尝试使用pgf90编译器运行该程序的“标量”版本?如果标量版本正常工作,但GPU版本不起作用,这有助于隔离问题。如果问题是pgf90/CUDA特定的,或许最好的地方问你的问题是

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

+0

标量版本正常工作,我可以将一个变量传递给ISHFT()函数,它给了我正确的答案。唯一不起作用的是将变量传递给GPU版本。我在pgi用户论坛http://www.pgroup.com/userforum/viewtopic.php?t=2455&sid=6dedb3c189bd64506e9ff883741c2e4f上问过类似的问题,但我担心如果我尝试重新发布,我会被定罪发布一个简单版本的问题,如发布在这里的问题 – Eddy 2011-02-17 15:00:46

相关问题