我需要了解一些有关CUDA共享内存的信息。假设我在G80卡中为每个块分配50个块,每个块有10个线程。 G80的每个SM处理器可以同时处理8个块。假设在进行一些计算之后,共享内存被完全占用。
当接下来的8个新块到达时,共享内存中的值是多少?以前的值会存在吗?或者先前的值是否会被复制到全局内存中并且共享内存会在接下来的8个块中刷新?
答案 0 :(得分:6)
它说明了类型限定符:
__device__ __shared__
在块的共享内存中键入变量,仅保留在内核__device__
在网格的全局内存中输入变量,直到应用程序退出__device__ __constant__
网格的类型变量,一直保持到应用程序退出因此,根据此参考,您的问题的答案是,如果存储器位于设备的共享内存中,则应为接下来的8个块刷新内存。
答案 1 :(得分:2)
对于内核块,随机分配执行顺序和SM。从这个意义上说,即使保留旧的价值或地址,也很难保持正确的轨道。我怀疑甚至有办法做到这一点。块之间的通信通过片外存储器完成。与片外存储器相关的延迟是性能杀手,这使得gpu编程变得棘手。在Fermi卡中,块共享一些L2缓存,但是不能改变这些缓存的行为。