4

だからこれは危険です。Columbia Physics System c++ ライブラリを使用したコードがあります。実行すると segfault が発生します。おそらく、CgArg、vector f_field_in などのクラスが初期化されていないためです。Valgrind を使用したところ、実際にさまざまな引数が無効なメモリを指していることがわかりました。

奇妙なことに、2 つの関数のどこかに iostream 呼び出しを挿入すると、segfault がなくなります。フラグをデバッグする場所に置いたときにわかりました。また、整数を定義して単純な cin >> を記述しても、セグメンテーション違反は発生しません。ということで、iostreamの関係かと思います。

iostream を呼び出すと何らかの理由で引数にコードが渡される理由を知っている場合は、それを共有していただければ幸いです。

#include <iostream>
using namespace std;

#include <config.h>
#include <util/lattice.h>
#include <util/dirac_op.h>
#include <util/gjp.h>
#include <interface.h>

#define CLOVER_MAT_SIZE 72

USING_NAMESPACE_CPS

// Same function for clover matrix and its inverse.
static
void interface(double *h_quda_clover, double *h_cps_clover)
{
  h_quda_clover[0]=h_cps_clover[0];  // c00_00_re = C0.x, A0

...そして、このようなものがたくさん...

  h_quda_clover[35+36]=h_cps_clover[34+36];  // c32_31_im = C8.w, A5
}

static
void fill_h_clover_inv(Lattice &lat, int site[], double *h_quda_clover_inv_site)
{
  double h_cps_clover_inv[72];
  Vector *f_field_out, *f_field_in;
  CgArg *arg;
  CnvFrmType convert=CNV_FRM_NO;
  DiracOpClover dirac(lat,f_field_out,f_field_in,arg,convert);
  //cout << "B: " << site << endl;
  //cout << "B: site: " << site[0] << ' ' << site[1] << ' ' << site[2] << ' ' <<         site[3] << endl;
  dirac.SiteCloverMat(site,h_cps_clover_inv);
  interface(h_quda_clover_inv_site,h_cps_clover_inv);
}

void fill_h_clover_inv_all(Lattice &lat, double *h_quda_clover_inv, int parity)
{
  double *ptr=h_quda_clover_inv;
  int nsites[4];
  nsites[0]=GJP.XnodeSites();
  nsites[1]=GJP.YnodeSites();
  nsites[2]=GJP.ZnodeSites();
  nsites[3]=GJP.TnodeSites();
  int site[4];
  cout << "A: " << site << endl;
  for (site[3] = 0; site[3] < nsites[3]; ++(site[3])) {
    for (site[2] = 0; site[2] < nsites[2]; ++(site[2])) {
      for (site[1] = 0; site[1] < nsites[1]; ++(site[1])) {
        site[0] = (site[3] + site[2] + site[1] + parity)%2;
        for (; site[0] < nsites[0]; site[0] += 2) {
  //cout << "A: site: " << site[0] << ' ' << site[1] << ' ' << site[2] << ' ' <<     site[3] << endl;
          fill_h_clover_inv(lat,site,ptr);
          ptr += CLOVER_MAT_SIZE;
        }
      }
    }
  }
}
4

1 に答える 1

1

問題は、いくつかの初期化されていない引数が DiracOpClover に渡されることにありました。CgArg を適切に初期化したら、

CgArg cg_arg;
cg_arg.mass=1.0

すべてがハンキードーリーでした!!

みんな助けてくれてありがとう。

于 2012-12-04T20:58:09.560 に答える