Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenMP和C:这个操作必须是原子的吗?_C_Openmp_Atomic - Fatal编程技术网

OpenMP和C:这个操作必须是原子的吗?

OpenMP和C:这个操作必须是原子的吗?,c,openmp,atomic,C,Openmp,Atomic,假设根据以下类型声明,我们有两个数组 bool B[ N ]; Bar Foo[ M ]; int B_of_Foo[ M ]; // 0 <= B_of_Foo[m] < N complexed_条件如果Bs的某些AND或or为真,但B[B_of_Foo[m]]为假。此代码保证在按顺序执行时完成。我想将其与OpenMP并行。可变重复可以通过还原来处理。我想知道是否有更新 B [ B_of_Foo[ m ] ] = true 然后必须标记为原子操作 我认为任何并发或重复的更新都会

假设根据以下类型声明,我们有两个数组

bool B[ N ];
Bar Foo[ M ];
int B_of_Foo[ M ]; // 0 <= B_of_Foo[m] < N
complexed_条件
如果Bs的某些AND或or为真,但
B[B_of_Foo[m]]
为假。此代码保证在按顺序执行时完成。我想将其与OpenMP并行。可变重复可以通过还原来处理。我想知道是否有更新

B [ B_of_Foo[ m ] ] = true
然后必须标记为原子操作


我认为任何并发或重复的更新都会产生相同的结果。即使一个线程使用过时版本的
B[B_of_Foo[m]]
检查复杂的_条件,其随后的写入操作也不会更改B的条目,并且即使while循环在不更新B的情况下重复,代码也是稳定的。

是的,
B[B_of_of_Foo[m]
的更新需要是原子的(或以其他方式序列化),因为多个线程写入同一变量的结果未指定,即使它们正在写入相同的值。根据OpenMP 3标准第1.4.1节(内存模型):

如果多个线程不同步地写入同一内存单元,包括由于上述原子性考虑而导致的情况,则会发生数据争用。类似地,如果至少一个线程从内存单元读取数据,并且至少一个线程不同步地写入同一内存单元,包括由于原子性考虑而导致的情况,则会发生数据争用如上所述的减额,则发生数据竞争。如果发生数据竞争,则程序的结果未指定


在开始时,大多数人都会想到一种内存模型,其中有某种类型的顺序一致性保证——就像在POSIX文件系统中一样——如果发生两个并发写操作,它们的行为就好像是用一个随机的“赢”操作序列化一样.在教授数据竞赛时,大多数人都会使用这种例子,但这并没有帮助。但这并不能保证,原则上,结果可能完全是胡说八道。(在您最喜欢的体系结构上是否会发生这种情况是另一个问题。在这里,您的值是单字节的,我认为您在x86上的大多数实现中都是可以的。但没有任何保证。)

你的意思是
重复|=true;
,或者更简单地说,
重复=true;
重复&=true
是一个noop,即
(false&true)==false
(true&true)==true
B [ B_of_Foo[ m ] ] = true