0

g++を使用すると(妥当な出力で)正常にコンパイルおよび実行されるC ++で記述されたコードがありますが、mpic ++を使用しようとすると、ランタイムバスエラーが発生します。バスエラーが発生している場所を特定できましたが、その理由はわかりません。これが私のコードです:

one = (double *) malloc(sizeof(&one) * nx * nx * nt);
two = (double **) malloc(sizeof(&two) * nx * nx);
rho_exp = (double ***) malloc(sizeof(&rho_exp) * nx);

for(i = 0; i < nx * nx; i++)
    two[i] = &one[i * nt];

for(i = 0; i < nx; i++)
    rho_exp[i] = &two[i * nx];

for(i = 0; i < nx; i++)
    for(j = 0; j < nx; j++)
        for(k = 0; k < nt; k++)
            rho_exp[i][j][k] = 0;

バスエラーは、ネストされた3つのforループ中に発生しています。私の質問は2つあります。1つは、3Dマトリックスへの割り当てを台無しにしたと思います。どうすればいいの?2つ目は、なぜこれがgccとg ++で機能したのに、mpic++では機能しなかったのでしょうか。

4

2 に答える 2

4

飛び出すことの1つは、おそらく(fooが指すもののサイズsizeof(&foo))を意味するときに(fooへのポインターのサイズ)を使用していることです。sizeof(*foo)

何が起こっているのかは、mpic ++が32ビットターゲットにコンパイルされていることだと思います。ここで、doubleのサイズは64ビットで、アドレスのサイズは32ビットです。それはあなたにミスマッチを与え、問題を引き起こします。g ++は、おそらく64ビットシステムをターゲットにしており、これらのサイズは同じです(両方とも64ビット)。

編集:

使用する必要のあるコードは次のとおりです。

  double * one = new double[nx * nx * nt];
  double ** two = new double*[nx * nx];
  double ***rho_exp = new double**[nx];

そして正直なところ、あなたは車輪の再発明をしているのです。ベンダー提供のBLASライブラリを使用する必要があります。このライブラリは、プラットフォーム用に最適化された高速マトリックス操作を備えています(おそらく、作成するものよりも数百倍高速です...)。

于 2011-01-13T15:57:43.550 に答える
1

X x YxZ配列を動的に割り当てるための一般的な手順は次のとおりです。

double ***rho_exp = malloc(sizeof *rho_exp * X);
if (rho_exp)
{
  size_t i;
  for (i = 0; i < X; i++)
  {
    rho_exp[i] = malloc(sizeof *rho_exp[i] * Y);
    if (rho_exp[i])
    {
      size_t j;
      for (j = 0; j < Y; j++)
      {
        rho_exp[i][j] = malloc(sizeof *rho_exp[i][j] * Z);
        if (rho_exp[i][j])
        {
          size_t k;
          for (k = 0; k < Z; k++)
          {
            rho_exp[i][j][k] = 0;
          }
        }
      }
    }
  }
}

気にしないでください、それはCのためです。C ++を使用newしているので、上記のように使用します。

于 2011-01-13T16:11:50.623 に答える