我有一个具有以下结构的代码。
#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] = ...; ..... }