Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.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
Parallel processing 为什么';OpenMP原子指令支持分配?_Parallel Processing_Atomic_Openmp - Fatal编程技术网

Parallel processing 为什么';OpenMP原子指令支持分配?

Parallel processing 为什么';OpenMP原子指令支持分配?,parallel-processing,atomic,openmp,Parallel Processing,Atomic,Openmp,openmp中的原子指令支持如下内容 x += expr x *= expr 其中expr是不引用x的标量类型的表达式。我明白,但我不明白你为什么不能: #pragma omp atomic x = y; 在cpu指令方面,这是不是更费力?在我看来,合法和非法语句都加载x的值和其他一些标量值,更改x的寄存器值并将其写回。如果有人能向我解释一下这些指令(我认为)有什么根本性的不同,我将不胜感激。因为建议的原子分配并不能保护任何东西 请记住,原子指令可以被认为是一个关键部分,可以(但不必)由编译

openmp中的原子指令支持如下内容

x += expr
x *= expr
其中expr是不引用x的标量类型的表达式。我明白,但我不明白你为什么不能:

#pragma omp atomic
x = y;

在cpu指令方面,这是不是更费力?在我看来,合法和非法语句都加载x的值和其他一些标量值,更改x的寄存器值并将其写回。如果有人能向我解释一下这些指令(我认为)有什么根本性的不同,我将不胜感激。

因为建议的原子分配并不能保护任何东西

请记住,原子指令可以被认为是一个关键部分,可以(但不必)由编译器使用魔法硬件有效地实现。设想两个线程使用shared
x
和private
y
到达
x=y
。所有线程完成后,
x
等于执行“wins”的最后一个线程,并将
x
设置为其
y
。将任务包装在关键部分,并且没有任何变化,最后一个线程仍然“获胜”。现在,如果线程在
x
之后执行其他操作,最慢的线程可能没有赶上,即使它有编译器,编译器也可以合法地使用选择
x
的某个缓存值(即线程的本地
y
)。为了避免这种情况,您需要一个屏障(因此获胜线程获胜)及其隐含的刷新(因此本地缓存已失效):


但我想不出一个好的理由来这样做。如果大多数线程都会(非确定性地)被丢弃,为什么还要在许多线程上查找y呢?

原子赋值很有用。如果X和Y的值的类型在任何意义上都是“大的”,则执行原子复制可确保生成的值X不包含任何可能被复制的值Y的不一致图片。当然,您还需要“原子读取”(您建议了一个屏障),以确保获取X的一个组件不会像上面描述的那样获取一个值的一部分。我想说的是,保护单个拷贝的开销通常相当高,从性能的角度来看,这可能没有多大帮助。-1:这个答案不正确。在读取或写入共享变量时,不保证原子性:“在不同步的情况下,多个线程对同一变量或同一变量中的不同变量(作为数组或结构元素)进行内存访问的最小大小”“OpenMP 3.1引入原子读/写是为了解决这一限制。这在OpenMP 3.1-->
原子更新中是可能的
x = y;
#pragma omp barrier
\\ do something with shared x...