2012-05-15 50 views
2

我有一个具有以下结构的代码。如何判断openmp不同步阵列

#pragma omp parallel for 
for(i = 0; i < N; i++) 
{ 
    ..... 
    index = get_index(...); 
    array[index] = ...; 
    ..... 
} 

现在的index值是为每个线程唯一的(它永远不会重叠的不同的线程),但当然OpenMP的不能让这种猜测,我想用同步对象访问array

如何让openmp不要使用array的同步对象,并依靠我index值对于不同的线程是唯一的。我尝试将array置于私人列表中,但出现了分段错误。

+1

OpenMP在默认情况下不会同步任何内容。所以这不应该是一个问题。索引是在并行区域内还是外部声明的? – Mysticial

+1

仅供参考:由于缓存垃圾,写入到来自不同线程的共享阵列会导致可怕的性能问题。你应该确保这些线程当前写入的indeces之间有一定的距离)。 – smerlin

回答

5

Openmp确实在屏障或隐含屏障上同步。例如,除非指定了nowait子句,否则for构造的末尾存在隐含的障碍。

但是openmp并没有通过访问来为你同步内存。相反,它为每个线程提供共享和私有内存块的机制。

在你的情况下,index需要是私人的。否则,每个线程写入相同的内存位置,当您访问array[index]时,您将遇到竞争状态。

为了演示,我明确设置了该行为,但i默认为私有,array默认为共享。

#pragma omp parallel for private(i, index) shared(array) 
for(i = 0; i < N; i++) 
{ 
    ..... 
    index = get_index(...); 
    array[index] = ...; 
    ..... 
}