-1
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,它会起作用。

请帮忙!

PS:x_并且Sk是该方法Update_Structure_Factor所属的类的成员。

4

2 回答 2

1

您在这里将大量数据放在堆栈上 - Ssin 和 Scos 每个大约 14MB。尽管不知道您使用的是哪个 C++ 编译器或目标硬件,但我认为与堆栈滥用有关的事情是一个合理的猜测。几乎可以肯定,将这些数组设为静态(线程不安全)或在堆外分配会更好。

不相关,但 C++ 不会自动为您初始化堆栈变量。您的代码假定数组以零开头。使数组静态实际上会在第一次执行 0 init,但您必须在每次调用时再次清除它们。

于 2013-05-09T05:59:57.303 回答
0

好的,我找到了另一种方法来使代码在不使用static关键字的情况下工作。k1我只是对,k2和的一半进行了抽样k3,即使它们仍然覆盖了我感兴趣的整个域(即,ik从 0 到 65)。这样,我没有获得分段错误错误,但程序在合理的时间内工作。

于 2013-05-09T06:50:49.517 回答