0

OpenMP で構造体の配列を使用していましたが、失敗していました。代わりに多次元配列を使用すると、適切な結果が得られました。なぜだろう。
使用される構造の定義:

struct loc (  

float **mig;  

}  

loc *Loc = new loc[nthread];  
for(i=0; i<nthread; i++)  
{  
    Loc[i].mig = new float*[nx];  
    for(j=0; j<nx; j++)  
    {  
         Loc[i].mig = new float[ny];  
    }    
}  

loc は並列セクションで共有され、tid を使用してアクセスされます。
この実装は失敗しました。

多次元配列を使用したよりも:

float ***mig;
mig = new float**[nthread];  
for(i=0; i<nthread; i++)  
{  
     mig[i] = new float*[nx];  
     for(j=0; j<nx; j++)  
     {  
          mig[i][j] = new float[ny];  
     }  
 }  

mig は並列セクションで共有されます。この実装は機能しました。ここでは、最初の次元として tid を使用して 2D mig にアクセスします。

どちらの場合も、mig 配列は for 句で並列に入力されます。

最初のケースはセグメンテーション違反で失敗しますが、2 番目のケースは正常に実行され、正しい出力が得られます。

mig にはネイティブ C コードから値を割り当てる必要があるため、ベクターは使用されません。

2つの違いを理解するのを手伝ってください。

4

1 に答える 1

0

あなたのエラーは次のようです...

for(i=0; i<nthread; i++)
{
    Loc[i].mig = new float*[nx];
    for(j=0; j<nx; j++)
    {
        Loc[i].mig = new float[ny];
        //        ^------------------------ right here
    }
}

一番内側のループにタイプミスがあります。代わりにこれを書くべきです:

for(j=0; j<nx; j++)
{
    Loc[i].mig[j] = new float[ny];
}

C++ は からfloat *への暗黙的な変換を警告すべきではありませんfloat **か?

于 2012-12-18T08:04:14.663 に答える