当提供的地址驻留在块共享内存中时,原子操作如何执行?在原子操作期间,是否会暂停块内其他线程对同一共享内存库的访问,或者阻止其他线程执行任何指令,甚至阻止所有块中的线程直到原子操作完成?
答案 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原子功能部分: “......在操作完成之前,没有其他线程可以访问此地址。”
您的问题可归纳为:
进行原子操作:
我的猜测是2:如果线程试图访问被活动原子操作锁定的内存,则线程会停止。
您可以通过编写计时器值来调查发生的情况,然后处理它们以确定阻塞行为。对不起,我没有明确的答案。