我需要了解一些关于CUDA共享内存的知识。假设我在G80卡上分配了50个块,每个块有10个线程。G80的每个SM处理器可以同时处理8个块。假设在进行一些计算后,共享内存已经被完全占用。
当下一个8个新块到达时,共享内存中的值将是什么?之前的值会留在那里吗?还是之前的值会被复制到全局内存中,并为下一个8个块刷新共享内存?
我需要了解一些关于CUDA共享内存的知识。假设我在G80卡上分配了50个块,每个块有10个线程。G80的每个SM处理器可以同时处理8个块。假设在进行一些计算后,共享内存已经被完全占用。
当下一个8个新块到达时,共享内存中的值将是什么?之前的值会留在那里吗?还是之前的值会被复制到全局内存中,并为下一个8个块刷新共享内存?
这段内容涉及类型限定符:
__device__ __shared__
类型变量在块的共享内存中,仅在内核中保留__device__
类型变量在网格的全局内存中,直到应用程序退出时才保留__device__ __constant__
类型变量在网格中,直到应用程序退出时才保留因此,根据这个参考,你的问题的答案是,如果下8个块驻留在设备的共享内存中,则应该为下一个8个块刷新内存。
对于内核块,执行顺序和SM是随机分配的。在这种意义上,即使旧值或地址保留,也很难跟踪事物。我怀疑甚至没有办法做到这一点。块之间的通信通过芯片外存储器完成。与芯片外存储器相关的延迟是性能杀手,这使得GPU编程棘手。在Fermi卡中,块共享一些L2缓存,但不能改变这些缓存的行为。