GPU共享内存64位模式下Bank冲突及访存顺序技术问询
关于CUDA共享内存Bank冲突与Bank定义的解答
问题1:线程同时访问Bank 0中的0、96、128号64位字的处理优先级与逻辑
在Kepler架构的64位共享内存模式下,字索引到Bank的映射规则为:Bank号 = 字索引 % 32。因此字0(0%32=0)、96(96%32=0)、128(128%32=0)都属于Bank 0,属于同一Bank的多线程访问,会触发多向Bank冲突。
- 处理优先级:硬件会按照发起访问的线程在warp内的线程ID从小到大的顺序,分批次处理这些访问。同一warp内,线程ID较小的线程对应的Bank访问会被优先调度执行。
- 间隔8字节同Bank字的处理逻辑:这里的“间隔8字节”是指共享内存中单个64位字的物理占用大小,但Bank内的存储并非连续物理地址——Bank 0存储的是所有满足
字索引 = k*32 + 0(k为非负整数)的64位字,这些字在共享内存的物理布局中是每隔32个64位字(即32*8=256字节)才出现一次。当线程访问Bank 0的不同k值对应的字时,本质是访问Bank 0存储阵列中的不同位置,由于单个Bank在一个周期只能处理一次读写,因此这三个访问需要拆分为3个独立的内存事务,分3个周期串行执行。
问题2:Bank的定义、存储内容与结构形态
- Bank的定义:Bank是CUDA共享内存的核心组成单元,是具备独立读写能力的存储体。共享内存通过划分多个Bank实现并行访问——所有Bank可以在同一个时钟周期内同时响应不同线程的访问请求,这是共享内存高带宽的关键。
- Bank中存储的内容:Bank存储的是共享内存中按映射规则分配的数据单元,具体取决于共享内存的位宽模式:
- 32位模式下:每个Bank存储32位(4字节)的数据字;
- 64位模式下:每个Bank存储64位(8字节)的数据字。
数据字会按照“字索引 % Bank总数”的规则分配到对应Bank中。
- Bank的结构形态:每个Bank可以看作是一个一维的存储阵列,阵列中的每个单元对应一个数据字(32或64位)。共享内存的整体布局由多个Bank交错排列构成,例如Kepler架构的共享内存包含32个Bank,共享内存的第i个数据字会被映射到第
i%32个Bank的第i//32个存储单元位置。
内容的提问来源于stack exchange,提问作者kdh
相关产品推荐
相关产品推荐

