我已經開始使用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]
謝謝 - 我曾經找過類似的東西,但一直沒能找到它。不幸的是,它並沒有真正解決我的問題 - 我用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
我一直沒有能夠得到G95的雪豹工作,但我期待得到一個支付(英特爾) – robince 2009-11-03 18:00:30