bank 是CUDA中一个重要概念,是内存的访问时一种划分方式,在CPU中,访问某个地址的内存时,为了减少读写内次次数,访问地址并不是随机的,而是一次性访问bank内的内存地址,类似于内存对齐一样,一次性获取到该bank内的所有地址内存,以提高内存带宽利用率,一般CPU认为如果一个程序要访问某个内存地址时,其附近的数据也有很大概率会在接下来会被访问到。

在CUDA中 在理解bank之前,需要了解共享内存。

shared memory

shared memory为CUDA中内存模型中的一中内存模式,为一个片上内存,比全局内存(global memory)要快很多,在同一个block内的所有线程都可以访问到该内存中的数据,与local 或者global内存相比具有高带宽、低延迟的作用。

Because it is on-chip, shared memory has much higher bandwidth and much lower latency than local or global memory.

为了提高share memory的访问速度 除了在硬件上采用片上内存的方式之外,还采用了很多其他技术。其中为了提高内存带宽,共享内存被划分为相同大小的内存模型,称之为bank,,这样就可以将n个地址读写合并成n个独立的bank,这样就有效提高了带宽。

To achieve high bandwidth, shared memory is divided into equally-sized memory modules, called banks, which can be accessed simultaneously. Any memory read or write request made of n addresses that fall in n distinct memory banks can therefore be serviced simultaneously, yielding an overall bandwidth that is n times as high as the bandwidth of a single module.

映射关系如下所图:

如上图共享内存映射为bank采用列映射方式,例如warp size = 32, banks = 16,(计算能力1.x的设备)数据映射关系如下

例如对于一个 32*32大小的float数组,

__shared__ float sData[32][32];

在一个warp size = 32,bank=32的GPU中 中bank的映射关系为:

上述例子中每一列为一个bank分布,同一个bank一次只能访问一次,不同bank可以同时访问。

Bank conflicts

如果在block内多个线程访问的地址落入到同一个bank内,那么就会访问同一个bank就会产生bank conflict,这些访问将是变成串行,在实际开发调式中非常主要bank conflict.

However, if two addresses of a memory request fall in the same memory bank, there is a bank conflict and the access has to be serialized. The hardware splits a memory request with bank conflicts into as many separate conflict-free requests as necessary, decreasing throughput by a factor equal to the number of separate memory requests. If the number of separate memory requests is n, the initial memory request is said to cause n-way bank conflicts.

上述图中part1、part2、part3都会访问到同一个bank,将会产生bank conflict ,造成程序串行化,会发现此时性能会产生严重下降。

在上述数组例子中,如果有多个线程同时访问一个列中的不同数组将会产生bank conflict

如果多个线程同时访问同一列中相同的数组元素 不会产生bank conflict,将会出发广播,这是CUDA中唯一的解决方案,在一个warp内访问到相同内存地址,将会将内存广播到其他线程中,同一个warp内访问同一个bank内的不同地址貌似还没看到解决方案。

不同的线程访问不同的bank,不会产生bank conflict

如下图所示:

图中左侧和右侧都没有发生bank conflict。而在中间村子bank conflict.

如果warp中的线程经过最多两次冲突就能得到所要的数据则成为2-way bank conflict,如果同一个warp中的所有线程访问一个bank中的32个不同的地址,则需要分32此,则称为32-way bank conflict,

注意:只要同一个 warp 的不同线程会访问到同一个 bank 的不同地址就会发生 bank conflict,除此之外的都不会发生 bank conflict。

上述图中均未产生bank conflict。

修改bank中bank size

注意共享内存中 每个SM的bank数量目前是无法修改的,但是可以修改bank中单个数组元素容纳的字节数,例如上个例子中

__shared__ float sData[32][32];,每个数组元素大小为4个字节,一般cuda中默认是按照4个字节进行组织被划分到bank中,CUDA提供可修改按照8个字节进行组织API:

__host__ ​cudaError_t cudaDeviceSetSharedMemConfig ( cudaSharedMemConfig config )

其中 cudaSharedMemConfi为一个枚举型:

cudaSharedMemBankSizeDefault = 0

cudaSharedMemBankSizeFourByte = 1

cudaSharedMemBankSizeEightByte = 2

只支持在host端进行调用,不支持在device端调用。

CUDA API中还支持获取bank size大小:

__host__ ​ __device__ ​cudaError_t cudaDeviceGetSharedMemConfig ( cudaSharedMemConfig ** pConfig )

该接口在host和device端都可调用。

参考资料

https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html

https://www.microway.com/hpc-tech-tips/gpu-shared-memory-performance-optimization/

https://blog.csdn.net/xysjj/article/details/103885803

https://blog.csdn.net/kebu12345678/article/details/82979934?utm_medium=distribute.pc_relevant_right.none-task-blog-BlogCommendFromMachineLearnPai2-4.nonecase&depth_1-utm_source=distribute.pc_relevant_right.none-task-blog-BlogCommendFromMachineLearnPai2-4.nonecase

CUDA bank 及bank conflict相关推荐

  1. 难理解的bank conflict

    之前看Nvidia-OpenCL-SDK里有一个例子讲到过bank conflict,但没怎么明白,它选择的是用奇数来避免. #define BLOCK_DIM 16// This kernel is ...

  2. 内存颗粒位宽和容量_SDRAM的逻辑Bank与芯片容量表示方法

    1.逻辑Bank与芯片位宽 讲完SDRAM的外在形式,就该深入了解SDRAM的内部结构了.这里主要的概念就是逻辑Bank.简单地说,SDRAM的内部是一个存储阵列.因为如果是管道式存储(就如排队买票) ...

  3. DDR从channel/rank/chip/bank/row/col/cell,DDR/GDDR/HBM

    DDR/GDDR/HBM请参考文献 1.ddr的层级结构 一个soc或者PC上的ddr都是有很多颗ddr single chip组成的.这么多颗ddr又组成了不同的层级.这些层级从大到小分为: cha ...

  4. 图解RAM结构与原理,系统内存的Channel、Chip与Bank

    文章目录 转载正文 标题挥发性内存分2种,SRAM和DRAM 主内存子系统 channel 和 DIMM rank 和 chip bank.row.column 内存的读写方式 越多越好,加速读写能力 ...

  5. 内存条的逻辑BANK和RANK(物理BANK)概念

    在内存上有一个参数:2R X16,1R X16, 1R X8-.. 这里的R就是Rank 既物理BANK,X16,X8,是指芯片位宽 何谓内存BANK: 内存的BANK其实分为两部分,逻辑BANK和物 ...

  6. 对一些内存名词术语的解释(bank ECC等)——转载

    内存 : BANK     Bank (内存库) 在内存行业里,Bank至少有三种意思,所以一定要注意. 1.在SDRAM内存模组上,"bank 数"表示该内存的物理存储体的数量. ...

  7. Xilinx FPGA中HR、HD、HP bank说明

      HR bank HP bank HD bank 全称 High Range High Performance High Desity 名称 高范围bank 高性能bank 高密度bank 电压范围 ...

  8. R12现金管理系统:银行对账单(Bank Statement)的标准处理流程

    ·银行对账单概念 银行对账单,是由银行发出的一种单据,详细记录着某个银行账户的资金进出情况.它是银行和企业核对账务的联系单,证实企业业务往来的记录. R12的现金管理模块(Cash Managemen ...

  9. 01_设计一个Bank类,银行某账号的资金往来账管理

    题目 设计一个Bank类,实现银行某账号的资金往来账管理,包括建账号.存入.取出等.Bank类包括私有数据成员top(当前指针).date(日期).money(金额).rest(余额)和sum(累计余 ...

最新文章

  1. Linux下的简单socket编程示例
  2. Python、Lua和Ruby比较——脚本语言大P.K.
  3. EVM反编译软件Porosity的使用-mac
  4. Spring 的优点
  5. Java基础(五)继承和多态
  6. dos进入/退出某文件夹
  7. Linux: 两个USB摄像头的数据采集问题
  8. 计算机视觉论文-2021-07-16
  9. python直接使用pyc_关于python包,模块,.pyc文件和文件导入理解
  10. ORACLE RAC 12C(12.1.0.2)数据库软件安装步骤
  11. 程序员面试宝典(第三版).pdf
  12. android 谷歌输入法切换,ANDROID谷歌拼音 输入法肿么切换?
  13. 电脑计算机安全模式在哪,电脑怎么进入安全模式? 进入安全模式详细教程
  14. PayPal美元和人民币之货币转换问题
  15. 2021-11-09 PMIC RK817 处理POWER键流程linux 部分的简单分析,dts 中会用 interrupt-parent interrupts去处理按键的中断。
  16. asp.net 获取网页源文件的方法
  17. 抑郁症自测量表测试软件,抑郁自评:医用抑郁自测量表,快来测一测你的抑郁指数是多少...
  18. 如何让linux时间与internet时间同步(centos)
  19. RTXa1000和a2000差距
  20. CSS3之好看的特效

热门文章

  1. 此图片来自微信公众平台未经允许不可引用
  2. MAVEN自定义项目骨架
  3. JEEWX推出插件开发机制,现招募兴趣爱好者
  4. JEECG Framework 3.3.1 beta版本发布第一天战报(文档下载量破1300、代码下载量破700)
  5. Java并发编程(02):线程核心机制,基础概念扩展
  6. hive入ES5.6.8
  7. Android开源源码推荐(一)
  8. 阿里发布《2015-2016中国云栖创新报告》,北上杭深广排名前5
  9. 菜鸟进阶Linux高手之路——第三天
  10. 设置mysql的interactive_timeout和wait_timeout的值