我有一个子程序,它在程序运行期间被调用了很多。我尝试使用尽可能多的可分配数组,并且多次调用子例程没有任何问题,但在某些时候,它以以下方式终止:
malloc.c:3790: _int_malloc: Assertion `(unsigned long)(size) >= (unsigned long)(nb)' failed.
当分配第一个数组时,这发生在子例程的开头。
改用不可分配数组,子例程被多次调用,但再次终止,现在:
wait: 28674: Memory fault(coredump)
我假设它在调用时终止,因为我在声明变量之后立即写出一些值,没有任何计算。
呼唤
do k=1, kreise
write(*,*)k
call rundheit(n(k),kreis(k,1:n(k),3),kreis(k,1:n(k),2),outrnd)
end do
其中“kreise”的值可能高达 1500。我打印出来并检查了在调用之前、在子例程中和在调用之后传递的参数的值。
限制“kreise”确实解决了问题,但限制不是一个实际的解决方案。我需要评估所有数据。不是它的断裂。
我的环境的一些注意事项:
我的程序是一个由 FEM 仿真软件使用英特尔 Fortran 编译器编译的子程序。据我所知,我没有机会更改编译器选项,也无法自行编译代码,因为它对 FEM 软件部署的子程序有很多依赖。
我在另一个更小更简单的模拟上开发并运行了这个精确的子程序,没有任何问题。只要我不使用这个特定的子程序,实际的“更大”的模拟运行也没有任何问题。(差异主要是节点密度,因此计算过程中考虑的数据量)其他用户子程序工作没有什么问题。所有子程序所做的只是在一些增量之间获取结果,进行一些分析并编写一些报告,而无需更改模拟。
我猜这个问题与内存处理有关,我不知道。
谢谢。
更新
我使用编译子程序-check all
并发现错误发生在被指责的子程序之前。两个数组,其中一个是 n(),多次超出范围,但在调用时错误会以某种方式(更)严重。奇怪的是,当错误发生时,它是超出界限的一些迭代,例如:这里两个数组都有大小(1:72)
,并且调用在某处中断 k=135 到 267,(我在一些运行期间发现的最低和最高值)。
问题是 integer Kreise
,该值是在循环期间设置的:
...
allocate(n(l))
allocate(pos(l))
...
do kreise = 1,l
pos(kreise)=minvalX+(Kreise-1)*IncX
if(pos(kreise).gt.maxvalX) exit
end do
总是kreise
变成 l+1。为什么?
注意:pos(kreise).gt.maxvalX
永远不应该是真的。成为真的不是问题,尽管它表明l
计算错误(到大)。通过减少几个循环的迭代,这个出口只会在以后节省计算时间。