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

Cuda 共享内存上原子操作的性能,cuda,gpgpu,Cuda,Gpgpu,当提供的地址驻留在块共享内存中时,原子操作如何执行?在原子操作期间,它是否会暂停块内其他线程对同一共享内存库的访问,或停止其他线程执行任何指令,甚至停止所有块上的线程,直到原子操作完成?摘自CUDA_C_Programming_Guide.pdf(CUDA SDK v5.0)中的B.11节原子函数: “…在操作完成之前,其他线程无法访问此地址。” 你的问题可以概括为: 原子操作是否: 停止块中的所有线程,或 仅当所有线程试图访问原子进程正在使用的内存时,才停止所有线程 操作,或 停止所有线程(在

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

摘自CUDA_C_Programming_Guide.pdf(CUDA SDK v5.0)中的B.11节原子函数: “…在操作完成之前,其他线程无法访问此地址。”

你的问题可以概括为:

原子操作是否:

  • 停止块中的所有线程,或
  • 仅当所有线程试图访问原子进程正在使用的内存时,才停止所有线程 操作,或
  • 停止所有线程(在所有块中)
  • 我的猜测是2:当线程试图访问由活动原子操作锁定的内存时,线程将停止


    您可以通过写入计时器值来调查发生了什么,然后对它们进行处理以确定阻塞行为。很抱歉,我没有确切的答案。

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

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