0
我有以下代碼:OpenMP實施屏障同步不能循環內的工作與if條件
#pragma omp parallel shared(a,n) private(i,j,k,x,pid,rows,mymin,mymax)
{
// nprocs=1;
#ifdef _OPENMP
nprocs=omp_get_num_threads();
#endif
#ifdef _OPENMP
pid=omp_get_thread_num();
#endif
rows=n/nprocs;
mymin=pid * rows;
mymax=mymin + rows - 1;
for(k=0;k<n;k++){
if(k>=mymin && k<=mymax){
#pragma omp for schedule(static,rows)
for(x=k+1;x<n;x++){
a[k][x]= a[k][x]/a[k][k];
}
#pragma omp barrier
}
}
}
在這裏,我選擇哪個線程將根據if條件更新矩陣的哪一行。例如,如果有兩個線程,線程1將更新矩陣'a'的前兩行,而線程2將更新另外兩個線程。
而我選擇後,我通過並行線程1和2之間的內部循環(其中我開始for(x=k+1,x<n;x++)
)將該行的列迭代分開。我也在內循環之後放置一個屏障,以便在更新單行的每個列值後,將其同步。
但問題是我沒有得到正確的同步值。在最終矩陣中,線程0更新的一些值在一些行中顯示,而一些由其他線程顯示,但不是全部。