2012-08-28 103 views
5

這個程序複製與Illegal instruction: 4 MacOSX上獅子和ifort(IFORT)崩潰12.1.0 20111011程序崩潰的陣列ifort

program foo 
     real, pointer :: a(:,:), b(:,:) 
     allocate(a(5400, 5400)) 
     allocate(b(5400, 3600)) 
     a=1.0 
     b(:, 1:3600) = a(:, 1:3600) 

     print *, a 
     print *, b 

     deallocate(a) 
     deallocate(b) 

end program 

同樣的計劃與gfortran。我沒有看到任何問題。有任何想法嗎 ?在兩個編譯器中展開副本並對列執行顯式循環。

請注意,使用allocatable而不是指針我沒有問題。

如果語句是在模塊內部或不在模塊內,則行爲相同。 我確認上ifort相同的行爲(IFORT)12.1.3 20120130.

顯然,Linux和ifort 12.1.5

沒有出現問題,我試圖增加與下面的鏈接選項的堆棧大小

ifort -Wl,-stack_size,0x40000000,-stack_addr,0xf0000000 test.f90

但我仍然得到相同的錯誤。增加ulimit -s到同樣的問題。

編輯2:我做了一些更多的調試,顯然當陣列拼接操作

 b(:, 1:3600) = a(:, 1:3600) 

涉及可疑接近16 M數據的值的問題發生。

我正在比較產生的操作碼,但如果有辦法看到更具溝通性的中間代碼表單,我很樂意欣賞它。

+0

我還在Mac Snow Leopard上收到ifort 12.1.1.246的「非法指令」。我建議報告英特爾Fortran論壇或提交錯誤報告。也許它是固定在12.1.5? –

+0

我在Mac Snow Leopard上使用ifort 12.0.3。也許這個bug已經存在了一點...... – EMiller

+0

顯然,問題也存在於(某些)linux盒子上:代碼段錯誤在CentOS 5.5和ifort 12.1上。 –

回答

1

使用「可分配」而不是「指針」。

真實,分配:: A(:, :),B(:, :)

分配一個浮點數的指針看起來可疑我。

+2

將數字分配給fortran中的分配指針沒有任何問題。Fotran指針不像C指針,除了=>運算符和相關的內建行爲主要像可分配數組。 – amaurea

4

你的程序是正確的(儘管如果你不需要重新指定它,我更喜歡可指向指針)。問題在於,ifort默認將所有數組臨時對象放在堆棧上,不管它們有多大。它似乎需要一個臨時數組來進行復制操作。要解決ifort的愚蠢默認行爲,總是在編譯時使用-heap-arrays標誌。即

ifort -o test test.f90 -heap-arrays 1600 

-heap-arrays後面的數字是開始使用堆的閾值。對於低於此的尺寸,使用堆疊。我在這裏選擇了一個非常低的數字 - 你可以安全地使用更高的數字。在理論上,堆棧陣列速度更快,但差異通常完全可以忽略不計。我希望英特爾能夠解決這個問題。每個其他編譯器都有明智的默認設置。