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つの違いを理解するのを手伝ってください。