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已分配给不同的线程,则不能保证第一个线程会在第二个线程开始之前完成,因此第二个线程将读取不正确(仍未更新)的值L[i-1][j-1]ordered您可以通过将子句赋予工作共享指令来使执行排序,omp for但这会终止并行化。

由于依赖是对角线的,你可以重新考虑你的算法以某种方式L对角线而不是按行。

于 2012-05-06T14:31:14.197 回答