CUDA 共享内存的 Bank Conflict 实例分析与优化

举报
ShaderJoy 发表于 2021/11/19 00:20:37 2021/11/19
2.9k+ 0 0
【摘要】   引言   CUDA 将 shared memory 按照 4 字节或 8 字节(默认 4 字节,可以设置为 8 字节)被划分到 32 个 bank (楼)中,不同 bank 之间的内存能同时读写,但是同一个 bank 的不同地址(同一栋楼的不同层)的数据则只能串行读写(如果是同一个...

引言

CUDA 将 shared memory 按照 4 字节或 8 字节(默认 4 字节,可以设置为 8 字节)被划分到 32 个 bank (楼)中,不同 bank 之间的内存能同时读写,但是同一个 bank 的不同地址(同一栋楼的不同层)的数据则只能串行读写(如果是同一个 bank 的同一个地址则可以 broadcast,不会出现 bank conflict),因此当同一个 warp 的线程去访问 shared memory 数据时,如果有两个以上线程访问了同一个 bank 的不同地址的数据,就会产生多余的内存事务(transaction)请求(后面有具体实例图示)影响程序的性能.

假设在共享内存上申请了 1024 个 float 数据 —— __shared__  float data[32][32],由于每个 float 正好是 4 字节,且 data 按行存储,则 data[0][0] 就位于第 0 个bank,data[0][1] 位于第 1 个 bank,以此类推 data[row][col] 就被划分在了第 col 个 bank 中,即 col 相同的数据划分至了同一个 bank 的不同地址上。如果一个 warp 的线程按 col 处理 data 那么就会造成 bank conflict.

文章来源: panda1234lee.blog.csdn.net,作者:panda1234lee,版权归原作者所有,如需转载,请联系作者。

原文链接:panda1234lee.blog.csdn.net/article/details/110185753

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。