gpt4 book ai didi

c - OpenMP 嵌套循环并行性

转载 作者:太空宇宙 更新时间:2023-11-04 00:40:30 26 4
gpt4 key购买 nike

我正在使用 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;
}
}
}

你怎么看,为什么我会得到错误的结果?我应该改变什么?

非常感谢!

最佳答案

你有一个循环数据依赖:

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

这里如果 ii-1 被分配给不同的线程,那么不能保证第一个线程会在第二个线程开始之前完成并且因此,第二个线程将读取 L[i-1][j-1] 的不正确(仍未更新)值。您可以通过为 omp for 工作共享指令提供 ordered 子句来使执行有序,但这会终止并行化。

由于依赖关系是对角线的,您可以重新考虑您的算法以某种方式对角线而不是行方式遍历 L

关于c - OpenMP 嵌套循环并行性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10470208/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com