当提供的地址位于块共享内存中时,原子操作如何执行?在原子操作期间,是否暂停块内其他线程对同一共享内存库的访问,或者阻止其他线程执行任何指令,甚至阻止所有块中的线程直到原子操作完成?
共享内存硬件包括1024个锁.如果调用在共享内存上运行的原子内在函数,编译器将发出一个获取并有条件地释放锁的短循环,或者如果未获取锁,则循环.因此,性能可能非常依赖于数据:如果warp中的所有32个线程尝试获取不同的锁,则它们将执行其原子操作并释放锁而不进行循环.另一方面,如果warp中的所有32个线程都尝试获取相同的锁,则warp将在每个线程执行其原子操作时循环31次,并释放所有其他线程正在尝试获取的锁.
获取的锁定由共享存储器地址的位2-11确定.因此,与CUDA中的大多数存储器操作一样,在连续的32位地址上操作通常会提供良好的性能.
归档时间: |
|
查看次数: |
3050 次 |
最近记录: |