这是我在stackoverflow上的第一个问题,在我被动地使用它之后。
我的问题实际上是非常具体的,但我尽量做到尽可能通用:我编写了一个程序来模拟量子物理波函数的时间演化。为此,我使用itensor libraries,它基本上在大张量上执行线性代数运算(类似于矩阵而不是两个而是几个索引),这使得张量以受控方式及时增长,即有一个上层张量大小的限制。这些模拟通常需要几天的运行时间和大量的内存。几个小时后,我得到了或多或少的随机分段故障。随机意味着它不能同时使用相同的模拟参数进行再现,但偶尔会发生。
当看到张量对象崩溃的那一刻,我可以看到,它的一些成员(指数)被错误地用默认创建的成员覆盖,这会在以后导致错误。因此,某些对象成员似乎在运行时被删除,然后又被新创建。我不是那方面的专家,但随机性和它发生的长时间使它看起来像我在运行时期间内存有一些问题。我通过引用传递所有大对象并在堆上显式定义它们,以最小化堆栈内存的使用
MPSt<IQTensor> *psi = new IQMPS(psi0);
compute_quantum_trajectory(...,*psi,...);
delete psi;
但这没有帮助。是否有一种方法可以通过porgram的其他部分影响/删除对象的属性,以及如何跟踪这种行为? 这里是该计划有问题部分的草图:
MPSt<IQTensor> *psi = new IQMPS(psi0);
compute_quantum_trajectory(...,*psi,...);
delete psi;
void compute_quantum_trajectory(...,MPSt<IQTensor> &psi,... )
{
for(int step = nstart; step < nfinal; ++step)
{
do_some_tensor_operation(psi,...);
}
}
void do_some_tensor_operation(MPSt<IQTensor> &psi)
{
// do some valid non-constant operation on psi
// program crashes sometimes, because Index of psi is overwritten
}
感谢您的帮助。
的Stefan