我有一个具有以下结构的代码。
#pragma omp parallel for
for( i = 0; i < N; i++ )
{
.....
index = get_index(...);
array[index] = ...;
.....
}
现在index
的值对于每个线程都是唯一的(它永远不会为不同的线程重叠),但是当然OpenMP无法猜测这一点,我想是使用同步对象来访问{{ 1}}。
我如何要求openmp不要为array
使用同步对象,并依赖我array
值对于不同的线程是唯一的。我尝试将index
放在私有列表中,但是为此会出现分段错误。
答案 0 :(得分: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] = ...;
.....
}