请教一个基础问题

各位大大,

最近在阅读关于shared memory 的 bank conflict,有以下一些疑问:

1.请问bank conflict 在 计算能力3.0的架构下(Kepler?)是否还很明显?
2.我看资料上说在compute capability 1.x 设备中,每个warp都是32个线程,每一个SM的shared memory 被划分为16个bank (0-15),请问在3.x设备下,还是这种情况吗?
3.我得设备上显示 warp size 是 32, 是不是说每个warp有 32 个 线程? 而在执行时时按照 half-warp执行的,也就是16个线程?
4. 资料上说bank的宽度固定在32bits,然后又说sharedmemory 被分为16个 bank, 我得sharedmemory per block 是 49152 bytes。。。这。。怎么分的。。我是不是概念上有问题?

  1. 还有,关于“广播机制”,这个被选为广播的地址,是系统自己选的吗?

LZ您好:

1:虽然根据某些第三方测试的结果表明,kepler上shared memory的bank conflict有一定的优化机制,但是并无官方资料证明或者证伪这一点,请您尽量以减少或者消除bank conflict的方式安排您的代码。

2:从fermi开始都是32banks的。以及warp一直都是32线程。

3:从fermi开始,都是按照warp执行的,half-warp概念仅在1.x硬件上有效,对于目前的主流GPU请无视此概念。以及对于某些早期的资料,请辩证地理解。

4:bank的宽度是32bit/4BYTE,每个SM上有32个banks(1.x时代是16banks),相邻的banks控制相邻4B的shared memory存储空间,每个bank控制一列存储空间,其地址相差4B*32=128B。
您可以简单讲shared memory看做是一个矩形的存储空间,连续地址是按行排列的,bank相当于控制器,有32个banks排成一排,管理着shared memory的每行存储空间,shared memory每行看做是128B的空间,每4B被一个bank管理,以及每行都是这样,所以每个bank管理了一列空间。
以及,每个bank每周期仅能提供一次读取或者写入操作,所以当同时需要有同一个bank管辖的存储空间中不同位置的多个数据需要访问的时候,会引发bank conflict。(如果是相同位置,则为广播)

shared memory per block的最大值就是一个SM上的shared memory的总数,此时一个SM上resident一个block。

5:广播机制在4:中已经解释。

祝您编码顺利~

以及,kepler架构下提供了8B宽度bank的运作模式,您可以根据4B模式的规律同样地加以理解。或者参阅programming guide。

以及,如果同一warp内有不同的线程同时向shared memory的统一位置写入数据,那么根据手册说明,将仅有一个线程写入成功,并且不保证具体是哪个线程成功。请您注意这一点,这一般是需要避免的操作行为。

祝您好运~

感谢ice大神的细心解释!受益匪浅!感觉现在看以前的资料好多都不能理解。。