fortran出現stack overflow的原因及解決辦法


有兩個type類型的數組A和B,大小均為N,N可能幾十萬大小。

當使用如下賦值方法時,提示stack overflow

A=B

當該成DO循環賦值時,就正常通過

do i=1,N

A(i)=B(i)

end do

網上找不到具體的原因,相關的問題整理如下:

http://emuch.net/html/201001/1800067.html

http://tieba.baidu.com/p/691353242

http://tieba.baidu.com/p/691353242

(1)整體賦值時都要放到stack里面,當循環賦值時則一個一個進入stack,不會出現溢出。

(2)貌似樓主有兩個N X N維的數組,如果這個是放在stack里的話,那就是非常大的了。

我不清楚FORTRAN的語法,不知道樓主聲明數組的方式是不是會把數組放在stack里。

如果是放在stack里的話,建議摟住把數組放到Heap里。

ps:stack就是堆棧,Heap就是堆。每個線程都有自己的stack用來保存局部變量和函數調用信息,根據編譯器不同,通常大小1~4MB

之間,如果用完了就會出現stack overflow exception。 

如果樓主不清楚的話,建議看一下Fortran語法關於內存管理的部分,非常大的數組應該是動態管理的,放在heap里。

(3)我同事原來也遇到過類似的問題,后來把project設置里的堆棧加大就可以了,默認是1M,你可以加大到10M試試. 

project-> setting-> link: 

在category里選擇output,在stack的Reserve里輸入0x10000000試試

(4)二樓沒說原因。一般來說,全局變量和靜態變量在數據段,大小幾乎沒有限制,也就是跟系統能訪問的內存大小相符。局部變

量在棧區,但是大小有限制,跟編譯器設置有關。動態分配內存在堆區,大小跟全局變量的一樣。

所以樓主的程序局部變量使用過多,導致棧溢出。這么大肯定溢出,這個變量在主程序和子程序中都是局部變量,只有放在程序之外

聲明才是全局變量,或者用動態分配。

(5)Fortran程序中報錯stack overflow: 

一般Fortran編譯器默認情況是allocatable array放在堆里, Automatic Array放在棧里. 棧的缺省設置一般為1048576 Byte = 1MB. 

數組越界, 在Visual Fortran里提示stack overflow. 在Fortran77這樣的UNIX平台下的編譯器里通常是core dump. 這時把棧的缺省

設置改大即可. 

辦法:(VISUAL FORTRAN里建立的該程序的WORKSPACE窗口內) 

MAIN MENU: Project ===> Setting ===> Link ===> Category : Output ===> Stack Allocations ===> Reserve : (棧大小) 

    1MB:    1048576 Byte 

   10MB:   10485760 Byte 

   64MB:   67108864 Byte 

100MB:  104857600 Byte 

128MB:  134217728 Byte 

256MB:  268435456 Byte (MAX)



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM