分配数组时出错

时间:2013-08-02 06:51:15

标签: malloc fortran allocation

我有一个子程序,在程序运行期间调用了很多。我尝试使用尽可能多的可分配数组,并且子例程被多次调用而没有任何问题,但在某些时候,它终止于:

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-Simulation软件使用英特尔Fortran编译器编译的子程序。据我所知,我没有机会改变编译器选项,我无法自行编译代码,因为它必须依赖于FEM软件部署的子程序。

我在另一个更小更简单的模拟上开发并运行这个精确的子程序,没有任何问题。只要我不使用这个特定的子程序,实际的“更大”的模拟运行也没有任何问题。(差异主要是节点密度,因此在计算过程中考虑的数据量)其他用户子程序工作没有问题。所有子程序都是在一些增量之间获取结果,进行一些分析并编写一些报告而不改变模拟。

我猜这个问题与内存处理有关,我不知道。

感谢。

更新
我使用-check all编译了子程序,发现错误发生在blamed子程序之前。两个数组,其中一个是n(),在几种情况下都是出界的,但是在调用时错误会以某种方式(更多)变得严重。奇怪的是,当错误发生时,它是超出界限的一些迭代,例如:这里两个数组的大小都为(1:72),并且调用在k = 135到267的某个地方中断(最低和最高值)我在一些运行期间发现了)。

问题是整数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计算错误(大)。然后,通过减少几个循环的迭代,此退出将仅节省计算时间。

1 个答案:

答案 0 :(得分:3)

程序可能正在写入内存,它不应该写入并破坏Fortran分配使用的malloc内存管理的结构。我建议使用Fortran选项进行运行时下标检查。使用ifort,请尝试-check all-check bounds