【问题标题】:How to tell openmp not to synchronize an array如何告诉openmp不要同步数组
【发布时间】:2012-05-15 22:18:38
【问题描述】:

我的代码具有以下结构。

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

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

我怎么能要求 openmp 不要为 array 使用同步对象,并依靠我 index 值对于不同的线程是唯一的。我尝试将array 放在私人列表中,但出现分段错误。

【问题讨论】:

  • OpenMP 默认不同步任何内容。所以这应该不是问题。 index 是在并行区域内部还是外部声明?
  • 仅供参考:从不同线程写入共享数组可能会导致可怕的性能问题,因为缓存垃圾。您应该确保这些线程当前写入的索引之间存在一定距离。

标签: c linux gcc openmp x86-64


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2010-12-01
    • 1970-01-01
    • 2013-12-28
    • 2012-12-11
    • 2010-12-19
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    相关资源
    最近更新 更多