cuda shareMemory bank conflict 探究

对存储的访问都是通过端口(port)完成的,如果允许两个线程(处理机)同时(绝对的同时)访问同一个存储器。这个存储器就需要相应数量的端口(port),这就通常说的单端口,双端口,或更多的端口。但多端口存储器有非常大的硬件开销,面积,功耗,延迟还会变糟糕。但对一类访问模式,比如所有处理机访问的地址都不相同,一个解决的办法就是将存储器按地址(一般是低地址的几位)分为若干个bank。多个处理机和多个bank通过crossbar或类似网络互联,处理机对不同bank的访问通过这个crossbar映射到相应的bank。但如果有两个处理机的地址同时映射到同一个bank上(低地址相同),就发生了冲突。简单的处理就是,系统无法实现这样的映射和请求,只能一一响应冲突的请求。当然,如果所有的请求都映射到一起,也就是广播,可以当作特殊情况处理。

我稍微补充一下,其实Shared Memory在图形模式下另有他用,在图形模式下主要是解决对Const Buffer进行Gather的问题。这是NV50架构独有的问题,在之前的GPU架构中并没有碰到过类似的问题。所以Shared memory的需求首先是来自于传统的图形方面。

其次,在通用计算模式下,也是一样的,主要解决SIMD处理器的Gather问题。兼顾为Thread提供Communication,这个功能是后期的硬件改进,早期的硬件只能在Global memory级别处理Atomic Operations。

为了加速Gather,最好的方式就是多端口存储器,但是就如大牛所说,太贵!所以这里使用了16-way Multibank来解决。但为这个Shared Memory什么不是warp的宽度,比如时32way呢,为什么只有16way呢?有没有大牛想过这个的问题?


这个决定因素可能比较多,一是从memory controller到SM的接口可能是16x32-bit宽的(不一定是物理的宽度,但是一次transaction的粒度),SM没有必要设计那么多bank。还有一个就是和硬件资源有关了,32x32的crossbar和bufferfly开关所占面积大致是16x16的2.5倍,从延时,面积都不好控制。

这应该和SM上的SP数量有关(8个SP),ALU(SP)的频率是SM前端存储器控制器工作频率的的双倍,SM每四个存储器时钟可发射一条warp指令,但是由于存储单元工作在
ALU的半频上,所以每个core时钟只能执行half-warp条存储指令,因此也就只需要16个bank.

你可能感兴趣的:(cuda shareMemory bank conflict 探究)