2011-01-13 7 views
0

g ++を使用するとコンパイルしてうまく動作するコードがC++で書かれていますが、mpiC++を使用しようとするとランタイムバスエラーが発生します。私はバスのエラーがどこで発生しているのか把握することができましたが、理由はありません。私のコードは以下の通りです:mpiC++を使用しているがg ++を使用していないバスエラー

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ループ中にバスエラーが発生しています。私の質問は二つあります。ひとつは、私は3Dマトリックスの割当を台無しにしました。私はそれをどのようにしなければなりませんか? 2つ、なぜgccとg ++で動作するのですが、mpiC++では動作しませんでしたか?

+0

valgrindの下でコードを実行できますか。そうすれば、あなたのバグがどこにあるのかがわかるはずです。 –

答えて

4

おそらくsizeof(*foo)(fooが指しているもののサイズ)を意味する場合、sizeof(&foo)(fooへのポインタのサイズ)を使用していることがあります。

私は、倍精度のサイズが64ビットでアドレスのサイズが32ビットである32ビットターゲットにmpiC++がコンパイルされていると思います。それはあなたに不一致を与え、問題を引き起こします。あなたのg ++​​はおそらく64ビットシステムを対象としています。これらのサイズは同じです(両方とも64ビット)。

EDIT:

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

そして、すべて正直に、あなたは車輪の再発明されています

ここでは、使用しなければならないコードです。ベンダー提供のBLASライブラリを使用する必要があります。このライブラリは、ご使用のプラットフォームに最適化された高速マトリックス操作を備えています(何よりも何倍も高速です)。

+0

私はこれが当てはまると考えましたが、sizeof(* foo)に変更すると、gccとg ++で動作しないだけでなく、mpiC++ではまだ動作しません。 – wolfPack88

+1

別の仮説を追加するために編集しました。 – EmeryBerger

+0

どのラインがバスエラーをトリガしますか? –

1

ここ動的XのX YのXのZアレイ割り当てるための一般的な手順は次のとおり

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を使用してください。

関連する問題