openmp 共享数组

Posted

技术标签:

【中文标题】openmp 共享数组【英文标题】:openmp shared array 【发布时间】:2013-04-01 16:54:41 【问题描述】:

我有两个用于共享数组和共享布尔标志的嵌套 for(s),我知道在尝试写入数组时可能会发生冲突,但如果我将这些部分设为关键,我将失去并行处理的所有好处.有什么选择可以避免这种情况并且仍然可以并行工作吗?谢谢

#pragma omp parallel 

#pragma omp for schedule (guided)
            for(int i=0;i<N-1;i++)
            
                for(int j=i+1;j<N;j++)
                
                    if(cluster[i*N+j]!=0)
                    
                        inner_set[i]=1;// Critical???
                        inner_set[j]=1;
                    
                    else
                    
                        outter_set[i]=1;
                    
                
            


do

    isChanged=false;
#pragma omp parallel for schedule (guided)      
            for(int i=0; i<N; i++)
            
                if(inner_set[i]!=0)
                
                    for (int j=0; j<N;j++)
                    
                        if(i!=j && outter_set[j]!=0)
                        
                            if(dis[i*N+j]<Dis)
                            
                                isChanged=true;
                                inner_set[i]=0;//critical???
                                outter_set[i]=1;
                            
                        

                    
                


        
while(isChanged);

【问题讨论】:

【参考方案1】:

首先并行性是沿着 索引 i 和 j 从 (i+1)->N 运行所有线程。 所以你认为的关键不是。下一行,即

inner_set[j] = 1

实际上被所有线程覆盖。

您需要 #pragma omp critical 来处理该行。

出于同样的原因,第二个循环再次有利于并行性。

【讨论】:

非常感谢。如果我做对了,那么通过索引 i 改变的东西在这个实现中并不重要,但是通过索引 j 改变的东西是关键的吗?使用锁可能会更好吗?再次感谢您。 是的。要进行调试,请以串行模式运行代码,然后并行运行并比较结果。如果可行,请投票给 ans,以便 any1 可以作为问题的解决方案。

以上是关于openmp 共享数组的主要内容,如果未能解决你的问题,请参考以下文章

将静态库链接到共享库(例如openmp)是一个好主意

为啥 OpenMP 减少在共享内存结构上比 MPI 慢?

如果共享堆栈或数据变量,OpenMP 是不是会将它们移动到堆中?

OpenMP 子句共享与关键

openMP 并行部分中的共享变量有些奇怪

多个 OpenMP 线程读取(不写入)共享变量的性能成本?