2011-02-17 65 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

相關問題