gpt4 book ai didi

openmp - 带有 OpenMP : when is it necessary and when is it helpful 的显式刷新指令

转载 作者:行者123 更新时间:2023-12-04 05:39:08 24 4
gpt4 key购买 nike

我从未使用过且不知道何时使用的一个 OpenMP 指令是 flush (有和没有列表)。

我有两个问题:

1.) When is an explicit `omp flush` or `omp flush(var1, ...) necessary?  
2.) Is it sometimes not necessary but helpful (i.e. can it make the code fast)?

我不明白何时使用显式刷新的主要原因是 flushes are done implicitly after many directives (e.g. as barrier, single, ...) 同步线程。例如,我无法看到使用刷新而不同步的方式(例如使用 nowait )会有所帮助。

我了解不同的编译器可能会实现 omp flush以不同的方式。有些人可能会将带有列表的刷新解释为没有(即刷新所有共享对象) OpenMP flush vs flush(list) .但我只关心规范的要求。换句话说,我想知道一个显式的 flush原则上可能是必要的或有帮助的。

编辑:我想我需要澄清我的第二个问题。让我举个例子吧。我想知道是否存在删除隐式刷新(例如使用 nowait)并改为使用显式刷新但仅在某些共享变量上会更快(并且仍然给出正确结果)的情况。类似于以下内容:
float a,b;
#pragma omp parallel
{
#pragma omp for nowait // No barrier. Do not flush on exit.
//code which uses only shared variable a
#pragma omp flush(a) // Flush only variable a rather than all shared variables.
#pragma omp for
//Code which uses both shared variables a and b.
}

我认为在第一个 for 循环之后代码仍然需要一个屏障,但是所有的屏障都有一个隐式刷新,这样就达不到目的了。是否有可能有一个不进行冲洗的屏障?

最佳答案

flush 指令告诉 OpenMP 编译器生成代码以使线程在共享内存上的私有(private) View 再次保持一致。 OpenMP 通常可以很好地处理这个问题,并为典型程序做正确的事情。因此,不需要 flush .

但是,在某些情况下,OpenMP 编译器需要一些帮助。其中一种情况是当您尝试实现自己的自旋锁时。在这些情况下,您需要组合刷新才能使事情正常进行,否则自旋变量将不会更新。获得正确的冲洗顺序将是困难的,而且非常非常容易出错。

一般建议是不应使用冲洗。如果有的话,程序员应该尽量避免使用列表(flush(var,...))刷新。有些人实际上是在谈论在 future 的 OpenMP 中弃用它。

就性能而言,刷新的影响应该是负面多于正面。由于它会导致编译器生成内存栅栏和额外的加载/存储操作,我希望它会减慢速度。

编辑:对于你的第二个问题,答案是否定的。 OpenMP 确保每个线程在需要时对共享内存具有一致的 View 。如果线程不同步,它们不需要更新它们对共享内存的 View ,因为它们在那里看不到任何“有趣”的变化。这意味着线程进行的任何读取都不会读取已被其他线程更改的任何数据。如果是这种情况,那么您的程序中就会出现竞争条件和潜在的错误。为了避免竞争,您需要同步(这意味着刷新以使每个参与线程的 View 再次一致)。类似的论点适用于障碍。在并行区域的计算中,您使用障碍开始一个新纪元。由于您将线程保持在锁步中,因此您很可能还会在前一个 epoch 中计算的线程之间拥有一些共享状态。

顺便说一句,OpenMP 可能会为线程保留私有(private)数据,但并非必须如此。因此,OpenMP 编译器很可能会将变量保留在寄存器中一段时间​​,这会导致它们与共享内存不同步。然而,对数组元素的更新通常很快就会反射(reflect)在共享内存中,因为线程的私有(private)存储量通常很小(寄存器集、缓存、暂存内存等)。 OpenMP 仅对您可以预期的内容提供一些较弱的限制。实际的 OpenMP 实现(或硬件)可能与它希望的一样严格(例如,立即写回任何更改并一直刷新)。

关于openmp - 带有 OpenMP : when is it necessary and when is it helpful 的显式刷新指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19687233/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com