如何告诉openmp不要同步一个数组

我有一个具有以下结构的代码。

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

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

我怎么能问openmp不要使用array同步对象,并依靠我的index值是不同的线程是唯一的。 我试图把array放在私人列表中,但是得到了分段错误。

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] = ...; ..... }