void Update_Structure_Factor ()
{
double Ssin [121][121][121];
double Scos [121][121][121];
double kdotr;
int ik;
double Sk_ [66];
int howmany [66];
for ( int i=0; i<x_.size(); ++i )
{
for ( int k1=0; k1<=120; ++k1 )
{
for ( int k2=0; k2<=120; ++k2 )
{
for ( int k3=0; k3<=120; ++k3 )
{
kdotr = (double)dQ*( (k1-60)*x_[i][0] + (k2-60)*x_[i][1] + (k3-60)*x_[i][1] );
Ssin[k1][k2][k3] += (double)sin(kdotr);
Scos[k1][k2][k3] += (double)cos(kdotr);
}
}
}
}
for ( int k1=0; k1<=120; ++k1 )
{
for ( int k2=0; k2<=120; ++k2 )
{
for ( int k3=0; k3<=120; ++k3 )
{
double k = (double)dQ*sqrt( pow((k1-60),2) + pow((k2-60),2) + pow((k3-60),2) );
ik = round(k/0.1);
Sk_[ik] += Ssin[k1][k2][k3]*Ssin[k1][k2][k3] + Scos[k1][k2][k3]*Scos[k1][k2][k3];
++howmany[ik];
}
}
}
for ( int i=0; i<66; ++i )
Sk[i] += (double)Sk_[i]/howmany[i];
}
第34行导致了这个问题,即Sk_[ik] += Ssin[k1][k2][k3]*Ssin[k1][k2][k3] + Scos[k1][k2][k3]*Scos[k1][k2][k3];
“有趣”的事情是,如果我将Ssin[k1][k2][k3]*Ssin[k1][k2][k3] + Scos[k1][k2][k3]*Scos[k1][k2][k3]
替换为2,则可行。
请帮忙!
P.S。:x_
和Sk
是此方法Update_Structure_Factor
所属类的成员。
答案 0 :(得分:1)
你在这里堆积了大量的数据--Ssin和Scos各占14MB。不知道你正在使用哪个C ++编译器或目标硬件,我仍然认为与堆栈滥用相关的东西是一个合理的猜测。你几乎肯定会让这些数组静态(线程不安全)或从堆中分配。
不相关,但C ++不会自动为您初始化堆栈变量。您的代码假设数组以零开头。使数组静态实际上第一次执行0 init,但是你必须在每次调用时再次清除它们。
答案 1 :(得分:0)
好的,我找到了另一种方法,可以在不使用static
关键字的情况下使代码正常工作。我只是对k1
,k2
和k3
的一半进行了采样,即使它们仍然覆盖了我感兴趣的整个域(例如,ik
从0到65)。这样,我没有获得分段错误错误,但程序在合理的时间内工作。