2

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

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

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

我怎么能要求openmp不要使用同步对象array并依赖我这个index值对于不同的线程是唯一的。我尝试放入array私人列表,但因此出现分段错误。

4

1 回答 1

5

Openmp 确实在障碍或隐式障碍处同步。例如,for除非指定 nowait 子句,否则在构造末尾有一个隐式障碍。

但是 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] = ...;
    .....
}
于 2012-05-16T08:45:07.670 回答