回顾上一篇帖子的问题:
有一个大小为16KB的数据结构,每个线程块以随机的方式对其访问,但每个线程束都以统一的方式对其访问。该数据结构最好用寄存器、常量内存还是共享内存进行保存,为什么?
我们作如下分析:
尽管将一个比较大的数组放入寄存器中有些麻烦,但将每个线程的寄存器按块进行划分将获得最快的访问速度,无论访问方式是怎么样的。然而,我们必须将寄存器分配给每个线程进行计算。只要程序访问片外存储,然吃就会阻塞整个SM。因此,如果要事该方案成为一个好方案,则需要绝大多数的操作都是基于寄存器的。
接下来,很多小伙伴提到了共享内存,共享内存确实是一个好的解决方案,然偶16KB的共享内存几乎消耗了1.x设备上的一个SM所有共享内存。然而在计算能力在2.x和3.x的硬件上,这个限制每个SM最多处理三个线程块。
最后,在计算能力为1.x的设备上,常量内存也是一个比较合理的选择。常量内存的广播机制对于线程有很大的帮助。然而,常量内存的缓存放不下16KB的数据。另外,更重要的是常量内存的缓存是针对线性访问优化过的,也就是说,每次访问都是基于缓存行获取的。因此,靠近初始访问数据将被缓存。非基于缓存行的访问将导致缓存未命中,造成的损失比直接访问全局内存还要大。
因此,共享内存在2.x和3.x计算能力的GPU上是一个好的选择,它提供了本应该在计算能力为1.x的设备上支持的常量内存广播机制。
根据回答的情况,决定将积分分给2楼、7楼和10楼的小伙伴,因为2楼和7楼的小伙伴回答正确,因此分别给予40积分,10楼的小伙伴由于没有回答正确,但积极参与,给予20积分奖励~