-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_andは、このメソッドが属するSkクラスのメンバーです。Update_Structure_Factor

4

2 に答える 2

1

ここでは、非常に多くのデータをスタックに入れています。Ssin と Scos でそれぞれ約 14MB です。使用している C++ コンパイラやターゲット ハードウェアがわからない場合でも、スタックの悪用に関連するものは合理的な推測だと思います。ほとんどの場合、これらの配列を静的 (スレッドセーフでない) にするか、ヒープから割り当てたほうがよいでしょう。

関係ありませんが、C++ はスタック変数を自動的に初期化しません。あなたのコードは、配列がゼロから始まることを前提としています。配列を静的にすると、実際には最初に 0 init が実行されますが、呼び出しごとに再度クリアする必要があります。

于 2013-05-09T05:59:57.303 に答える