【CUDA编程概念】一、什么是bank conflict?

news2024/11/28 19:50:12

前言

搜了不少答案,大多是在避免Bank Conflict,很难找到一个关于Bank Conflict的详细定义,这里找了些资料来尝试解释下;

一、基础概念

先简单复习下相关概念

GPU调度执行流程:

  • SM调度单位为一个warp(一个warp内32个Thread)

GPU存储层次:

  • shared_memory 可以 被一个warp中的所有(32个)线程进行访问
  • shared memory内部划分成Bank,一个Bank大小为32Bit(8Byte),一个时钟周期可以读取一个Bank内完整的数据

关于shared memory的介绍,《Using Shared Memory in CUDA C/C++》里还有一段:

To achieve high memory bandwidth for concurrent accesses, shared memory is divided into equally sized memory modules (banks) that can be accessed simultaneously. Therefore, any memory load or store of n addresses that spans b distinct memory banks can be serviced simultaneously, yielding an effective bandwidth that is b times as high as the bandwidth of a single bank.
— 《Using Shared Memory in CUDA C/C++》

有了上述的背景概念后,我们可以对读写过程先算下理论时间复杂度:

假设读写shared memory次数为 N, 一次读写的时间复杂度为 O ( 1 ) O(1) O(1),那么读写 N N N次所需时间复杂度为 O ( N ) O(N) O(N)

假设shared_memory被分成 B B B块Bank,并且可以被进行同时访问,那么理想情况下,读取 N N N次所需的时间复杂度为 O ( N / B ) O(N/B) O(N/B)

二、Bank Conflict

这里先贴张图,来自cuda-c-programming-guide,下图中左边没有Bank Conflict | 中间存在Bank Conflict,称为2-way Bank Conflict | 右边没有Bank Conflict

在这里插入图片描述
这里有个问题,当不同线程读写同一个Bank中的数据时,会发生什么?

回到《Using Shared Memory in CUDA C/C++》:

However, if multiple threads’ requested addresses map to the same memory bank, the accesses are serialized. The hardware splits a conflicting memory request into as many separate conflict-free requests as necessary, decreasing the effective bandwidth by a factor equal to the number of colliding memory requests. An exception is the case where all threads in a warp address the same shared memory address, resulting in a broadcast. Devices of compute capability 2.0 and higher have the additional ability to multicast shared memory accesses, meaning that multiple accesses to the same location by any number of threads within a warp are served simultaneously.
— 《Using Shared Memory in CUDA C/C++》

上面主要有两点:

  • 当多个线程读写同一个Bank中数据时,会由硬件把内存 读写请求,拆分成 conflict-free requests,进行顺序读写
  • 特别地,当一个warp中的所有线程读写同一个地址时,会触发broadcast机制,此时不会退化成顺序读写

注:上面提到触发broadcast机制的条件是all threads acess same address,但在翻阅cuda-c-programming-guide以及NVProfGuide时,发现只要是多个thread 读写就会触发broadcast(不需要All)

另外关于读写同一地址时的行为,在最新版本的NVProfGuide里,给出了更明确的流程:

When multiple threads make the same read access, one thread receives the data and then broadcasts it to the other threads. When multiple threads write to the same location, only one thread succeeds in the write; which thread that succeeds is undefined.

即,

  • 多个线程读同一个数据时,仅有一个线程读,然后broadcast到其他线程
  • 多个线程写同一个数据时,仅有一个线程写,具体是哪个线程写入 是 未定义的

如cuda-c-programming-guide 中给了示意图:左边模拟随机访问 | 中间Thread 3,4,6,7,9访问Bank5中同一个地址 | 右边多个Thread访问 Bank12, Bank20 触发广播机制

依据Bank Conflict 的定义以及广播条件的触发条件 来看,该图中的左/中/右三种访问形式,均没有“Bank Conflict”情况
在这里插入图片描述

所以,这里用一句话解释什么是Bank Conflict:

在访问shared memory时,因多个线程读写同一个Bank中的不同数据地址时,导致shared memory 并发读写 退化 成顺序读写的现象叫做Bank Conflict;

特别地,当同一个Bank的内存访问请求数为 M M M时,叫做M-way Bank Conflict;

回到开始读写 N N N次的理论时间复杂度 O ( N / B ) O(N/B) O(N/B)我们可以看到,当存在M-way Bank Conflict时,时间复杂度变成 O ( M ∗ N / B ) O(M * N/B ) O(MN/B)(退化了M倍)

三、如何发现存在Bank Conflict?

关于检测 Bank Conflict , 目前NVProf工具已经可以检测出某段Kernel函数存在Bank Conflict)

Updates in 2023.2

Added support for rules to highlight individual source lines. Lines with global/local memory access with high excessive sector counts and shared accesses with many bank conflicts are automatically detected and highlighted.

另关于如何避免Bank Conflict的解法(如在CUDA Best Practices里提到的增加Padding等)

参考资料

感兴趣的读者,可以参考下其他人对bank conflict的定义

  • stackoverflow:什么是bank conflict?:https://stackoverflow.com/questions/3841877/what-is-a-bank-conflict-doing-cuda-opencl-programming

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1052382.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI-FGNet降噪算法

上一篇文章介绍AI-CGNet降噪算法和AI-GruNet降噪算法,本篇文章介绍一个新的轻量级降噪做法AI-FGNet。 一、模型结构 AI-FGNet网络相比AI-GruNet,额外添加一层全连接实现特征的维度变换,作为频谱压缩、控制计算量的一种手段。此外&#xff0c…

Win11下无法打开丛林之狐,提示未检测到DirectX 8.1

新装的win11系统,打开丛林之狐提示未检测到DirectX 8.1. 运行dxdiag检查DirectX版本: DX版本已经是12了: 最终参考了这篇文章解决了: 罪恶都市出现XX-directx version 8.1处理方法 - 知乎 控制面板 > 程序 > 启用或关闭Wi…

(三) gitblit管理员手册

(一)gitblit安装教程 (二) gitblit用户使用教程 (三) gitblit管理员手册 目录 权限管理创建仓库时创建用户普通用户 管理员用户访问限制和访问权限仓库创建权限分配 Teams普通组管理员组 参考资料 权限管理 创建仓库时 选择指定的人员查看,克隆,推送 不允许fork 对应Anonymo…

9.30小任务

消息队列实现进程之间通信方式 实现了父子进程之间的通信 #include <myhead.h>//消息结构体 typedef struct {long msgtype; //消息类型char data[1024]; //消息正文 }Msg_ds;#define SIZE sizeof(Msg_ds)-sizeof(long) //正文大小int main(int arg…

从私服上拉取jar包,就是拉取不下来

明明私服上有jar包&#xff0c;但是就是拉取不下来&#xff0c;原因有很多种&#xff0c;我这里分享一种情况&#xff0c;我是因为idea的maven配置忘记改过来了&#xff0c;如下&#xff1a; 因为setting配置文件是拷贝来的&#xff0c;嫌麻烦&#xff0c;配置文件里的本地仓库…

10链表-单链表构造LinkedList

目录 LeetCode之路——707. 设计链表 分析&#xff1a; Code&#xff1a; LeetCode之路——707. 设计链表 你可以选择使用单链表或者双链表&#xff0c;设计并实现自己的链表。 单链表中的节点应该具备两个属性&#xff1a;val 和 next 。val 是当前节点的值&#xff0c;n…

如何写一份完整的职业规划书?

写职业规划书&#xff0c;确定今后几年的一个发展方向&#xff08;职业规划建议越早越好&#xff09;&#xff0c;帮助自己收获更大的成功。普通的职业规划书书写起来十分简单&#xff0c;没有想象中那样复杂&#xff0c;只需要包括基本的部分&#xff0c;就可以轻轻松松完成。…

Go-Ldap-Admin | openLDAP 同步钉钉、企业微信、飞书组织架构实践和部分小坑

目录 一、Docker-compose快速拉起demo测试环境 二、原生部署流程 安装MySQL&#xff1a;5.7数据库 安装openLDAP 修改域名&#xff0c;新增con.ldif 创建一个组织 安装OpenResty 下载后端 下载前端 部署后端 部署前端 三、管理动态字段 钉钉 企业微信 飞书 四、…

源码编译elfutils

编译环境 阿里云ubuntu20.04 编译步骤&#xff1a; 1 下载elfutils-0.170源码 2 解压 3 按照elfutils-0.170 (linuxfromscratch.org) 的描述&#xff0c;首先 ./configure --prefix/usr --program-prefix"eu-" 4 make 此时发生一个问题&#xff0c;报错&#x…

支付宝电脑网站支付,支付退款

一&#xff1a;支付宝退款 示例代码&#xff1a; AlipayClient alipayClient new DefaultAlipayClient("https://openapi.alipay.com/gateway.do","app_id","your private_key","json","GBK","alipay_public_key&qu…

CSS 选择器Day01

CSS 定义&#xff1a;层叠样式表(Cascading Style Sheets&#xff0c;缩写为 CSS)&#xff0c;是一种用于定义网页或文档的外观和样式的标记语言。 CSS是一种 样式表 语言&#xff0c;用来描述 HTML 文档的呈现 (美化内容)。它用于控制文本的字体、颜色、间距、布局、背景等各…

Java安全之servlet内存马分析

目录 前言 什么是中间键 了解jsp的本质 理解servlet运行机制 servlet的生命周期 Tomcat总体架构 查看Context 的源码 servlet内存马实现 参考 前言 php和jsp一句话马我想大家都知道&#xff0c;早先就听小伙伴说过一句话木马已经过时了&#xff0c;现在是内存马的天下…

力扣:114. 二叉树展开为链表(Python3)

题目&#xff1a; 给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链表应该同样使用 TreeNode &#xff0c;其中 right 子指针指向链表中下一个结点&#xff0c;而左子指针始终为 null 。展开后的单链表应该与二叉树 先序遍历 顺序相同。…

【WebGIS实例】(11)Cesium自定义区域裁剪(挖除挖出)

前言 本篇博客完全参考cesium-地面裁剪(多个剪切面)_cesium clippingplane-CSDN博客&#xff0c;感谢孙霸天大佬提供的实现方法。在此博客的基础上&#xff0c;本篇博客做了以下工作&#xff1a; 修复点位集合逆时针和顺时针导致不同的结果的问题新增了挖出的实现方案创建裁切面…

算法基础课

第一讲 基础算法 快速排序 归并排序 二分 整数二分模板 关键------画一个仅有整数的一维横轴 bool check(int x) {/* ... */} // 检查x是否满足某种性质 // check()判断mid是否满足性质// 区间[l, r]被划分成[l, mid]和[mid 1, r]时使用&#xff1a; int bsearch_1(in…

数据结构--Trie字符串统计

1、“Trie树” 作用&#xff1a; 高效地存储和查找字符串集合的数据结构。 2、“Trie树” 存储字符串的形式如下&#xff1a; 用 “0” 来表示 “根节点&#xff08;root&#xff09;”。存入一个字符串时&#xff0c;会在字符串最后结尾的那个字符节点打上标记。比如&#x…

No163.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

Java-多线程基础及线程安全

文章目录 1. 线程的状态1.1 观察线程的所有状态1.2 观察线程的转态和转移 2. 多线程带来的风险, 线程安全2.1 观察线程不安全2.2 线程安全的概念2.3 线程不安全的原因2.4解决上述代码的线程不安全问题 3. synchronized 关键字3.1 synchronized 的特性3.2 synchronized 使用示例…

【Leetcode】 450. 删除二叉搜索树中的节点

给定一个二叉搜索树的根节点 root 和一个值 key&#xff0c;删除二叉搜索树中的 key 对应的节点&#xff0c;并保证二叉搜索树的性质不变。返回二叉搜索树&#xff08;有可能被更新&#xff09;的根节点的引用。 一般来说&#xff0c;删除节点可分为两个步骤&#xff1a; 首先…

数学小把戏 6174

Wills健身房的手牌编号就是存放衣服的柜子。 柜子是狭长的L或7型&#xff0c;竖着放刚够塞进双肩背包&#xff0c;偶尔我横过来塞进 L 型底座或7的顶柜。 尴尬来的比偶尔次数还是多一点。 在我换衣服时候&#xff0c;旁边的柜子要打开&#xff0c;压迫感陡然拉满。局促的空间…