2010-06-30 64 views

回答

0

原子操作比正常运行慢,因为他们真的不能并行发生。

可能发生的情况是每次添加都会一次完成一次,但执行过程不会超过添加,直到所有线程都完成为止,它将从代码的角度看起来是平行的。

我不确定访问是否会合并,但原子操作的速度损失可能会超过内存访问速度的好处。

+0

是的。然而,我一直想知道的是,由于G200设备的内存控制器足够智能,可以解决半扭曲的冲突和未合并的读/写访问,假设内存控制器具有足够的独立原子操作执行单元进行处理,可能所有跨越半war的操作可以并行完成,而不会受到其他设备memoryu请求的中断。这可能吗? – 2010-07-30 03:36:54

+0

例如,如果每个warp执行诸如atomicAdd(baseAddress + tid,x)之类的更新,则对于半warp的所有操作可以由存储器控制器并行完成(如果它具有16个加法器而不是1)。问题是,is这种情况? – 2010-07-30 03:41:12

1

编程时,您可以将原子操作视为概念上平行(同时仍然满足原子性的要求)。

优化时有助于了解可能发生的序列化。实际发生的情况取决于您正在运行的硬件。性能取决于原子内存单元的位置和数量,以及并行执行的内存访问模式。

例如,如果并行寻址的位置映射到完全不同的原子单元,它们将并行发生。如果许多地址并行映射到同一个原子单元,则它们必须被序列化。原子操作性能从sm_11(计算能力1.1,最初出现的位置)到sm_2x(费米器件),一直到sm_3x(开普勒器件)均有所改善。开普勒改进了最差情况下的原子内存操作性能(其中许多原子操作访问相同的内存地址)高达10倍,并且最佳情况下的性能(其中许多原子操作访问非常不同的内存地址)高达2倍。开普勒的原子性能足够高,您可以考虑使用以前可能采用了显式并行简化代码的原子。有关更多详细信息,请参见this presentation

注意:这个讨论适用于全局内存原子。共享内存原子是一个不同的野兽,通常导致序列化,因此没有很高的性能。

0

要重述一下已经说过的内容:原子操作将按顺序执行,但由于所有其他操作暂停,因此它们将会同时执行(并行)。需要注意的一点是,虽然原子操作是有序的,但它们的ORDER不能被控制。