CUDA 共享内存

3

我需要了解一些关于CUDA共享内存的知识。假设我在G80卡上分配了50个块,每个块有10个线程。G80的每个SM处理器可以同时处理8个块。假设在进行一些计算后,共享内存已经被完全占用。

当下一个8个新块到达时,共享内存中的值将是什么?之前的值会留在那里吗?还是之前的值会被复制到全局内存中,并为下一个8个块刷新共享内存?


1
你能再解释一下吗?我不确定我理解你的意思。 - lurscher
1
我的解释/简化:每个块都需要一个处理器的所有共享内存,即每个处理器一次只能托管一个块。启动足够多的块,以便处理器将托管两个块以完成内核执行。现在,看一个处理器...在它执行第一个块之后,共享内存已被使用,并且可能具有有意义的值。这些值是否仍将存在于第二个块中,并且它们的地址是否与先前块的地址相同? - jmilloy
是的,那就是我想要的答案。 - kar
2个回答

6

这段内容涉及类型限定符:

  1. 线程中寄存器中的变量,仅在内核中保留
  2. 线程中全局内存中的变量,仅在内核中保留
  3. __device__ __shared__ 类型变量在块的共享内存中,仅在内核中保留
  4. __device__ 类型变量在网格的全局内存中,直到应用程序退出时才保留
  5. __device__ __constant__ 类型变量在网格中,直到应用程序退出时才保留

因此,根据这个参考,你的问题的答案是,如果下8个块驻留在设备的共享内存中,则应该为下一个8个块刷新内存。


2

对于内核块,执行顺序和SM是随机分配的。在这种意义上,即使旧值或地址保留,也很难跟踪事物。我怀疑甚至没有办法做到这一点。块之间的通信通过芯片外存储器完成。与芯片外存储器相关的延迟是性能杀手,这使得GPU编程棘手。在Fermi卡中,块共享一些L2缓存,但不能改变这些缓存的行为。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接