共享内存上的原子操作性能

时间:2013-10-21 21:50:15

标签: cuda gpgpu

当提供的地址驻留在块共享内存中时,原子操作如何执行?在原子操作期间,是否会暂停块内其他线程对同一共享内存库的访问,或者阻止其他线程执行任何指令,甚至阻止所有块中的线程直到原子操作完成?

2 个答案:

答案 0 :(得分:7)

共享内存硬件包含1024个锁。如果调用在共享内存上运行的原子内在函数,编译器将发出一个获取并有条件地释放锁的短循环,或者如果未获取锁,则循环。因此,性能可能非常依赖于数据:如果warp中的所有32个线程尝试获取不同的锁,则它们将执行其原子操作并释放锁而不进行循环。另一方面,如果warp中的所有32个线程都尝试获取相同的锁,则warp将在每个线程执行其原子操作时循环31次,并释放所有其他线程试图获取的锁。

获取的锁定由共享存储器地址的位2-11确定。因此,与CUDA中的大多数存储器操作一样,在连续的32位地址上操作通常可以提供良好的性能。

答案 1 :(得分:0)

CUDA_C_Programming_Guide.pdf(CUDA SDK v5.0)中的B.11原子功能部分: “......在操作完成之前,没有其他线程可以访问此地址。”

您的问题可归纳为:

进行原子操作:

  1. 停止块中的所有线程,或
  2. 仅在尝试访问原子使用的内存时才停止所有线程 操作,或
  3. 停止所有线程(在所有块中)?
  4. 我的猜测是2:如果线程试图访问被活动原子操作锁定的内存,则线程会停止。

    您可以通过编写计时器值来调查发生的情况,然后处理它们以确定阻塞行为。对不起,我没有明确的答案。