据我了解OpenMP 3.1规范(2.8.6)中的以下声明
在给定线程上执行的没有列表的flush构造,就好像刷新了基本语言定义的程序的整个线程可见数据状态一样。
意味着,如果任何线程操纵复杂数据(例如数组或结构,甚至是int,通过指针变量),当我们使用flush时,我们无法确定任何其他线程是否会看到所做的修改es(显式或隐式)。
找到以下引文:
没有变量名称列表的刷新会刷新此时可见的所有变量 在该计划中。使用列表刷新仅刷新列表中的变量。 ... OpenMP flush 操作是OpenMP计划的唯一方式,保证 一个值将在两个线程之间移动。
摘自:J.P。Hoeflinger,B.R。 De Supinski,OpenMP内存模型// IWOMP'05 / IWOMP'06的会议录,Springer-Verlag,柏林,海德堡,2008年,第167-177页。 Available here
因此,例如,在线程间数据依赖性的情况下,对阶段计算(a-la BSP)使用屏障同步(flush implied)在这种情况下本身不提供数据修改的可见性。
我应该在release-acquire(RelAcq)上使用C ++ 11 CAS操作,还是使用顺序一致的原子来提供内存栅栏,或者使用一组锁(AFAIK锁建立在RelAcq atomics之上)以提供p2p同步和可见性担保?
P.S。:如果是OpenMP 4.0,#pragma omp atomic seq_cst
是一个选项吗?