如何告诉openmp不要同步数组

时间:2012-05-15 22:18:38

标签: c linux gcc openmp x86-64

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

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

现在index的值对于每个线程都是唯一的(它永远不会为不同的线程重叠),但是当然OpenMP无法猜测这一点,我想是使用同步对象来访问{{ 1}}。

我如何要求openmp不要为array使用同步对象,并依赖我array值对于不同的线程是唯一的。我尝试将index放在私有列表中,但是为此会出现分段错误。

1 个答案:

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