Fortran的堆栈溢出解决方法
每个线程都有自己的堆栈用来保存局部变量和函数调用信息,根据编译器不同,通常大小1~4MB之间,如果用完了就会出现stack overflow exception。此外,数组传递是按址传递的,即传递的是地址和长度,不会额外开辟内存空间,因此可直接定义。如果是调用子过程中定义的临时数组,则需要重新开辟内存空间,此时需要考虑堆栈溢出问题。
当Fortran的数组特别大时就会出现堆栈溢出现象,解决措施有如下几种:
一是优化代码,一般默认的stack size是足够的,通常stack overflow 都是某些bug或者很恶劣的算法导致的。
修改一下代码,减小stack的使用。比如避免递归调用,避免数组整体赋值和计算,采用循环方式进行。
二是增大堆栈(stack)的空间。方法参见博客"fortran 增大堆栈,解决stack overflow".
三是使用堆(Heap)存放数组,即使用动态方式定义数组。堆空间是没有大小限制的,理论上可以分配到2G的用户内存空间(32位Windows的默认配置)被用完为止。例如:
Real*8 A1(N, N), B1(N,N),X1(N)
改成:
real (kind=8), allocatable:: A1(:, : ), B1(:,: ),X1(: ) !定义数组为动态内存分配
allocate(A1(N, N),B1(N, N),X1(N)) !在堆上动态分配内存
程序结束后A1将自动释放堆内存空间,但最好自己释放已经分配的内存:
deallocate(A1,B1,X1)
此外好像用公共变量定义可以解决这个问题吧,只是公共变量不大好管理,要很小心才行。