线程之间的OpenMP复杂数据可见性

时间:2014-10-09 21:41:22

标签: c++ multithreading openmp

据我了解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是一个选项吗?

0 个答案:

没有答案