1

OpenMP を使用していますが、結果が間違っているという問題があります。

コードは次のとおりです。

    #pragma omp parallel shared(L,nthreads,chunk) private(tid,i,j){
        tid = omp_get_thread_num();
        if (tid == 0)
        {
            nthreads = omp_get_num_threads();
            printf("Starting matrix multiple example with %d threads\n",nthreads);
            printf("Initializing matrices...\n");
        }

        #pragma omp for schedule (static, chunk) 
        for( i=0; i<SIZE_A;i++){
            for( j=0; j<SIZE_B;j++){
                if(A[i]==B[j]){
                    if(i==0 || j==0)
                        L[i][j]=1;
                    else
                        L[i][j] = L[i-1][j-1] + 1;
                }
                // or reset the matching score to 0
                else
                    L[i][j]=0;
            }
        }
    }

どう思いますか、なぜ私は間違った結果を得ているのですか? 何を変更すればよいですか?

どうもありがとう!

4

1 に答える 1

7

ループ データ依存があります。

L[i][j] = L[i-1][j-1] + 1;

ここで、反復ii-1が別のスレッドに割り当てられている場合、最初のスレッドが 2 番目のスレッドが開始する前に終了するという保証はなく、したがって 2 番目のスレッドは の誤った (まだ更新されていない) 値を読み取りますL[i-1][j-1]orderedワークシェアリング ディレクティブに句を指定して実行を順序付けることはできますが、omp forそれによって並列化が強制終了されます。

依存関係は対角線であるため、アルゴリズムを再考してL、行方向ではなく対角線方向に歩くことができます。

于 2012-05-06T14:31:14.197 に答える