2009-11-03 132 views
2

我已經開始使用Fortran(95)生成一些數字代碼(生成python模塊)。下面是一個簡單的例子:Fortran:32位/ 64位性能可移植性

subroutine bincount (x,c,n,m) 
    implicit none 
    integer, intent(in) :: n,m 
    integer, dimension(0:n-1), intent(in) :: x 
    integer, dimension(0:m-1), intent(out) :: c 
    integer :: i 

    c = 0 
    do i = 0, n-1 
    c(x(i)) = c(x(i)) + 1 
    end do 
end 

我發現,這32位有很好的表現,但在作爲x86_64的編譯是約5倍速度較慢(MacBook Pro的酷睿2,雪豹,gfortran 4.2.3從r .research.att.com)。我終於意識到這可能是由於使用32位整數類型而不是本機類型,實際上,當我用整數* 8替換時,64位性能僅比32位的性能差25%。

爲什麼在64位機器上使用32位整數慢得多?是否有任何隱含的強制轉換,我可能不知道?

對於這種類型的代碼,64位是否會比32位慢(我對此感到驚訝) - 還是有機會讓64位編譯版本運行速度相同或更快?有什麼辦法可以聲明一個(整數)變量是'原生'類型...即32位時編譯32位,64位時編譯64位現代fortran。如果沒有這個,看起來不可能編寫便攜式fortran代碼,根據編譯的代碼它不會太慢,而且我認爲這意味着我將不得不停止對我的項目使用fortran。我曾看過kind和selected_kind,但沒能找到任何這樣做。

[編輯:大性能損失是由f2py包裝複製陣列從64位INT將它轉換爲32位整型,所以沒有什麼固有的FORTRAN]

回答

2

回答你的主要問題'是選擇正確的編譯器選項,以32或64位聲明默認的整數。我從來沒有使用gfortran(我更喜歡g95,甚至更好的付費編譯器),所以我谷歌搜索,似乎-fdefault-integer-8是你需要的選項。

就像你我很驚訝,64位版本比32位版本慢。在這一點上我沒有任何亮點。

+0

謝謝 - 我曾經找過類似的東西,但一直沒能找到它。不幸的是,它並沒有真正解決我的問題 - 我用f2py封裝子程序,當我使用該選項時,它會扼流(總線錯誤),因爲我猜f2py爲32位整數生成整數。所以如果我這樣做,我仍然必須手動編輯每個平臺的生成的接口,這是我想要避免的(只是想把它給人)。我真的很想從http://gcc.gnu.org/onlinedocs/gcc-3.4.6/g77/Kind-Notation.html那裏得到類似kind = 7的東西,但它似乎已經過時(不適用於gfortran) – robince 2009-11-03 17:59:24

+0

我一直沒有能夠得到G95的雪豹工作,但我期待得到一個支付(英特爾) – robince 2009-11-03 18:00:30

1

雖然我沒有仔細研究,但我還沒有看到如此大的速度差異。

我建議嘗試更新版本的gfortran。版本4.2更早(gfortran從4.0開始)並被認爲已過時。 4.3和4.4都有很大的改進,並具有更多的功能。 4.4是目前的非beta版本。在Mac上獲取它們的簡單方法是通過MacPorts:gcc43和gcc44軟件包包含gfortran。編譯器安裝爲gcc-mp-4.3,gfortran-mp-4.3等,以免與其他版本衝突。或者你可以嘗試gfortran wiki頁面上的最新版本4.5。

英特爾fortran有時比gfortran快得多。

2

真的也試過使用64位來運行watfor 77但我的是完全不可能的。我有一個gf-FOR-compiler用於我的64位,並嘗試了一些選項在谷歌上使用後來給出了一個選項使用gcc-mp 4.3和gfortran 4.3。版本仍然很慢。 我建議你使用32位機器,這是一個fortran壓縮運行你的程序或降級你的64位到32位來運行你的progs更快,更準確。 讓我們繼續研究,以便通過WATFOR77和子例程來實現64位機器的運行。