我从未使用过且不知道何时使用的一个 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)?
我不明白何时使用显式刷新的主要原因是,刷新是在许多同步线程的指令(例如屏障、单一、...)之后隐式完成的。例如,我看不到使用刷新而不同步(例如 with nowait
)的方式会有所帮助。
我了解不同的编译器可能omp flush
以不同的方式实现。有些人可能会将带有列表的刷新解释为没有(即刷新所有共享对象)OpenMP 刷新与刷新(列表)。但我只关心规范的要求。换句话说,我想知道明确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 循环之后代码仍然需要一个屏障,但是所有的屏障都有一个隐式刷新,这样就达不到目的了。是否有可能有一个不进行冲洗的屏障?