在Compute Capability 2.0(Fermi)发布之后,我一直在想是否还有任何用例可以使用共享内存。也就是说,在什么情况下使用共享内存比让L1在后台执行更好?
共享内存只是为了让设计针对CC < 2.0的算法能够高效运行而存在吗?
要通过共享内存进行协作,块中的线程将写入共享内存并与__syncthreads()
同步。为什么不直接写入全局内存(通过L1),并使用 __threadfence_block()
进行同步呢?后者应该更容易实现,因为它不必涉及到两个不同值的位置,并且应该更快,因为没有从全局内存显式复制到共享内存。由于数据被缓存在L1中,线程不必等待数据实际上全部传输到全局内存。
使用共享内存,可以保证放置在其中的值在整个块的持续时间内保持在那里。这与L1中的值相反,如果它们不经常使用,则会被清除。是否有任何情况需要将这些很少使用的数据缓存在共享内存中,而不是根据算法实际使用模式让L1管理它们?