首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于F2Py的Fortran矩阵的间歇内存分配误差

基于F2Py的Fortran矩阵的间歇内存分配误差
EN

Stack Overflow用户
提问于 2014-01-28 23:45:52
回答 2查看 341关注 0票数 0

背景:

我有一个Python脚本,它使用Fortran代码进行密集的计算。我正在使用F2Py来完成这个任务。一个特定的Fortran子例程构建一个在以后的计算中使用的矩阵。这个子例程在一个循环中迭代,并在每一步进行求解。下面给出了使用基本数组和变量的代码片段:

代码语言:javascript
运行
复制
for i in xrange(steps):
    x+=dx
    F_Output=Matrix_Build_F2Py.hamiltonian_solve(array_1, array_2, array_3, array_4)
    #Do things with F_Output

SUBROUTINE Hamiltonian_Solve(array_1, array_2, array_3, array_4, output_array)

!N_Long, N_Short are implied, Work, RWork, LWork, INFO
INTEGER, INTENT(IN), DIMENSION(0:N_Long-1)  :: array_1, array_2, array_3 
INTEGER, INTENT(IN), DIMENSION(0:N_Short-1) :: array_4
COMPLEX*16,ALLOCATABLE                      :: Hamiltonian(:,:)
COMPLEX*16, DIMENSION(0:N_Short             :: Complex_Var
DOUBLE PRECISION, INTENT(OUT), DIMENSION(0:N_Short-1)       :: E
INTEGER                                                     :: LWork, INFO, j
COMPLEX*16,       ALLOCATABLE                               :: Work(:)

ALLOCATE(Hamiltonian(0:N_Short-1, 0:N_Short-1))
ALLOCATE(RWork(MAX(1,3*(N_Short-2))))    
ALLOCATE(Work(MAX(1,LWork)))              
ALLOCATE(E(0:N_Short-1)) 

DO h=0, N_Long-1
Hamiltonian(array_1(h),array_2(h))=Hamiltonian(array_1(h),array_2(h))-Complex_Var(h)
END DO


CALL ZHEEV('N','U',N_Short,Hamiltonian,N_Short,E,Work,LWork,RWork,INFO)

DO j=0,N_Short-1
    Output_Array(j)=E(j)
END DO

END SUBROUTINE

但是,由于某些原因,这个子例程使我的Python程序崩溃,并生成以下malloc错误:

代码语言:javascript
运行
复制
error for object 0x1015f9808: incorrect checksum for freed object - object was probably     modified after being freed.

这个错误是不寻常的,因为它并不是每次都发生,而是只发生了很大一部分时间。我已经确定,错误的根源在于行:

代码语言:javascript
运行
复制
Hamiltonian(array_1(h),array_2(h))=Hamiltonian(array_1(h),array_2(h))-Complex_Var(h)

好像我把它改为:

代码语言:javascript
运行
复制
Hamiltonian(array_1(h),array_2(h))=Hamiltonian(array_1(h),array_2(h))

错误停止了。但是,Complex_Var对于输出是必不可少的,否则程序只会产生零。This线程与我的问题有一些相似之处,但这个问题似乎在每次运行之后都会出现,而我的则不是。我已经注意确保数组不不匹配,其他安排(即不考虑numpy的不同数组格式)立即创建分段错误,正如预期的那样。

问题

为什么Complex_Var要破坏代码?为什么这个问题是间歇性的而不是系统性的?有什么明显的(或者不是很明显的)建议来避免这一点吗?

任何帮助都将不胜感激!

EN

Stack Overflow用户

发布于 2014-01-29 00:26:16

根据问题的第一次评论和修订更新:

我发现问题表达式中的某些数组具有高维N_long-1 (即array_1和array_2)和数组Complex_Var维度N_short。循环迭代到N_Long-1。你知道那个N_Long-1 <= N_short吗?如果不是,您可能正在访问非法的o Complex_var下标。你知道吗,array_1和array_2中的值总是汉密尔顿的合法下标?如果在该数组的保留大小之外写入,则可能会破坏内存分配器在创建某个数组时使用的信息,从而阻止它以后释放该数组。

如果这是问题所在,使用编译器的运行时下标检查选项可以帮助您找到类似的错误。

票数 1
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21419329

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档