0

私は並列プログラミングとopenmpの世界に慣れていないので、これは無駄な質問かもしれませんが、私が経験していることに対する良い答えを思いつくことができないので、誰かが光を当てることができることを願っています.問題について。

私が達成しようとしているのは、次の並列セクションを処理するすべてのスレッドに動的に割り当てられた (整数の) マトリックスのプライベート コピーを用意することですが、実行フローがその領域に入るやいなや、おそらくプライベート マトリックスへの参照です。 null 値を保持します。

私が認識していないこのディレクティブの制限はありますか? 一次元の動的配列では、すべてがうまく機能しているようです。

コードのスニペットは次のとおりです...

#define n 10000
int **matrix;
#pragma omp threadprivate(matrix)

int main()
{

    matrix = (int**) calloc(n, sizeof(int*));
    for(i=0;i<n;i++) matrix[i] = (int*) calloc(n, sizeof(int));
    AdjacencyMatrix(n, matrix);

    ...

   /* Explicitly turn off dynamic threads */
   omp_set_dynamic(0);
   #pragma omp parallel
   {    
      // From now on, matrix is NULL... 
      executor_p(matrix, n);
   }
   ....
4

2 に答える 2

0

句で何が起こるかについては、 OpenMP のドキュメントを参照してください。threadprivate

並列領域への最初のエントリでは、PARALLEL ディレクティブで COPYIN 句が指定されていない限り、THREADPRIVATE 変数と共通ブロックのデータは未定義であると想定する必要があります。

matrix並列領域の変数に格納される値は保証されません。

于 2012-04-30T15:48:23.040 に答える
0

OpenMP は、既知のストレージ サイズを持つ変数のみをプライベート化できます。つまり、配列が のように定義されている場合は、配列のプライベート コピーを持つことができますdouble matrix[N][M]。あなたの場合、ストレージサイズが不明であるだけでなく(ポインタはそれが指している要素の数を格納しません)、行列はメモリ内の連続した領域ではなく、動的に割り当てられた行のリストへのポインタです。

最終的には、行列データ自体のプライベート コピーではなく、トップレベル ポインターのプライベート コピーを持つことになります。

于 2012-05-04T22:32:54.383 に答える