cuda代码高效策略--b站看课的笔记

news2024/9/22 17:38:01

1.1 高效公式

在这里插入图片描述

在这里插入图片描述要么增大数据量,要么减少每个线程的内存(每个线程读取的数据量变少,每个线程的读取数据的速度变快(转变存储方式,对读取慢的地方做优化–合并全局内存))

1.2 合并全局内存

在这里插入图片描述一个线程读取一个数据,读取数据的方式有三种

  1. 数组是连续的,按照顺序读----
  2. 固定步长读取,比如每隔两个读一个
  3. 随机读取,在任意位置开始获取数据

下面代码显示,假设g是全局内存,threadIdx.x是当前的线程号,意思是,当前线程号是多少就读取这个对应的数组,线程号连续所以读取的数据是连续的。
尽量让总的数据量和线程号挂钩去读取

1.3 避免线程发散

在这里插入图片描述
一个kernel中的所有线程都跑完才叫做运行结束,决定最后速度的是,执行时间最慢的那个
在这里插入图片描述
每个线程执行的次数不一样,一号线程执行一次loop,二号线程执行两次loop.

2 cuda各种内存的代码使用

在这里插入图片描述

本地变量,直接在kernel里面定义初始化,使用
在这里插入图片描述
全局变量都是使用指针去执行的,必须进行数据copy

在这里插入图片描述
共享变量,大家都往里面写或者读就会有时间差的问题,must要进行同步,大家都往里面写,写完了以后加同步,在这里kernel的加载可以有三个参数,第三个参数是共享内存的大小

在这里插入图片描述

同步操作

4.1 原子操作

在这里插入图片描述
会拖慢整体的速度,原本是并行的程序,突然使用原子操作使得其中某一种步骤,变成了串行的,在读取或者写入某些线程的时候是需要排队的,因为同一时间只能有一个线程进行操作
在这里插入图片描述某一个在往里面写的时候,别的可能在往里面读,就会出错

  1. 自己设置同步,大家都写完了然后再进行下一步
  2. 原子操作,就是把加法的地方,写成,atomicAdd(& g[i], 1); 函数去做加法

4.1 同步函数

在这里插入图片描述
在这里插入图片描述
跨block的数据读取的时候,需要用到。

4.3 cpu/gpu同步

在这里插入图片描述
在host去调用

并行化高效策略(1)

5.1 归约 Reduce–多个输入一个输出

实例:求和:1+2+3+4+……
在这里插入图片描述
多个数据(输入)放在长度为n的数组里面,把内存中的每一个数都分配到一条线程里面去计算,
比如有1024个线程块,每个线程块里有1024个线程,

  1. 每个块里面的线程 都对应读取数字
  2. 随机抽取一个线程块,获取每个线程在块里面的编号,idx
  3. 1024个线程进入循环,循环中if idx<1024/2
    Arr[idx]=arr[idx]+arr[idx+1024/2]
    Arr[idx]+=arr[idx+1024/2]
    就相当于 线程块在做对折,第0 个线程数值加第512个线程数值,1+513,2+514……
    全部做完以后 if idx<1024/2/2
    继续做对折,一直到 arr[0]+=arr[1];
    循环时,线程号大于if条件内的不产生加法运算。
  4. 把所有线程块的结果,存放在一个线程块的1024条线程里面去,再进行对折相加
1. 假设有1024个block,每个block里面有1024条线程,每条线程读取对应的一条数据
2. 对于其中的一个块,就是每个线程要进入一个循环,每条线程在这个块里面对应的idx(索引),二分,1024个数据进行对折,第0个跟第512个加起来,1+5132+514……
3. 512个数据进行对折,第0个跟第256个加起来,1+2572+258……
4. 重复操作,最后会得到,第0个数据加第一个数据
5. 这样得到一个1024大小块的求和结果,把所有的块的做同样操作,得到1024个和
6. 把这1024个和放在一个大小为1024的块里重复2-4

数据以成倍的方式,把另外一半的数据加过来
在这里插入图片描述
myId-----1024个block,每个block里面有1024条线程,所有的线程里面,对应的线程号,为了读取对应全局内存
tid---------当前线程块的线程号,为了判断,二分,越小循环的次数会越多,s会取到512,256,128……
在这里插入图片描述
这一步即我得到了一个中间值,有每一个block的结果,再放进去1个块(block=1)的线程里面(threads=blocks);
最后得到输出结果 d_out
在这里插入图片描述
对应上面操作的5 6 两步
11. 这样得到一个1024大小块的求和结果,把所有的块的做同样操作,得到1024个和
12. 把这1024个和放在一个大小为1024的块里重复2-4
在这里插入图片描述
共享内存数据 速度快
首先定义共享内存,就是在每一个block里面设置一个共享内存(线程),不断往共享内存中读、写数据

在这里插入图片描述
当前定义了共享内存数组
全局内存d_in对应的线程块赋值给共享内存(sdata[tid]=d_in[myid])
再也不需要读取全局内存了 所以才快了 最后再复制回结果即可。

5.2 扫描 Scan–多对多,多少个输入就有多少个输出

在这里插入图片描述
前面的数据不断进行累加时候
分为3步,

  1. 把与自身 间隔为1(2的0次方)的数 与自身相加,结果记录下来
  2. 对第一次的结果 与自身 间隔为2(2的1次方)的数 与自身相加,没有对应项 相加的,就直接写下来放在原来位置
  3. 对第二次的结果,与自身 间隔为4(2的2次方)的数 与自身相加,没有对应项的 ,写在原来位置 得到最后的输出结果。

把每一个数据看作一个线程,每一个数值经历了三次循环。当它不符合一定条件时,循环并不增加(不做加法),横向作为,横向数组全部循环完毕(用上一次的结果),所以需要设置同步屏障
不断的更新输出的,所以可以把第一次的初始值,作为输出值 d-out=d-in,先做一次同步屏蔽,
接下来循环(以间隔为标准)大于0,表示有东西可加,
比如11+7数组的第7个位置+第5个位置,要保证第5个是7,而不能是更新之后的,所以会先赋值给out

在这里插入图片描述

https://www.bilibili.com/video/BV15Y4y1F7tE?p=15&spm_id_from=pageDriver&vd_source=fa871d85ec6ff3a94c2b3af862650e05

看的这个课做的笔记

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

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

相关文章

电子台账:模板制作之二——行过滤(垂直过滤)

1 简介大部分情况下&#xff0c;企业数据源表格中&#xff0c;只有部分行的数据可用于电子台账。例如&#xff0c;一共100行数据&#xff0c;我们只要取得其中20行即可。如果所有数据一股脑全部导入到台账中&#xff0c;再手工删除不需要的行&#xff0c;太麻烦了&#xff0c;有…

js变量和函数提升

1、变量提升 变量提升是JavaScript 中比较“奇怪”的现象&#xff0c;它允许在变量声明之前即被访问 (仅存在于var声明变量) 注意: 1.变量在未声明即被访问时会报语法错误 2.变量在var声明之前即被访问&#xff0c;变量的值为 undefined 3.let/const声明的变量不存在变量提升…

sqli-labs通关lesson36-40

1.lesson36 union select判断注入&#xff1a;为单引号注入?id1%df-- 查数据库&#xff1a;?id-1%df union select 1,2,database()-- 2.lesson-37 报错注入判断注入&#xff1a;为单引号注入通过下方判断password为单引号注入unamez&passwdg%df -- &submitSubmit查数…

神经网络之反向传播算法(自适应梯度算法Adagrad)

文章目录自适应梯度算法&#xff08;Adagrad&#xff09;1、算法原理2、算法实现2.1 训练过程2.2 测试过程及结果3、参考源码及数据集自适应梯度算法&#xff08;Adagrad&#xff09; 自适应梯度算法&#xff08;Adaptive gradient algorithm&#xff0c;Adagrad&#xff09;与…

惊!初中生也来卷了……

大家好&#xff0c;我是良许。 前两天在抖音直播的时候&#xff0c;突然来了一位不速之客…… 他自称是初中生&#xff0c;一开始我还有点不太相信&#xff0c;直到跟他连麦&#xff0c;听到他还略带一些稚嫩的声音&#xff0c;我才知道&#xff0c;他没有骗我…… 他说他想学…

Dynamic Movement Primitives (DMP) 学习

Dynamic Movement Primitives (DMP) 学习 【知乎】Dynamic Movement Primitives介绍及Python实现与UR5机械臂仿真 1. DMP的建模过程 链接&#xff1a;Dynamic Movement Primitives介绍及Python实现与UR5机械臂仿真 - 知乎 (zhihu.com) 沙漏大佬&#xff01;&#xff01;&am…

转行软件测试需要学习哪些知识点?来来来,都给你汇总在这里啦!

都说IT互联网行业吃香&#xff0c;那么如何才能高效转行&#xff0c;习得一技之长换取心仪offer&#xff1f; 一般来说&#xff0c;0基础小白想转行到软件测试行业&#xff0c;按照如下学习逻辑肯定是错不了的&#xff1a; 1.零基础小白入门篇&#xff08;学前扫盲&#xff09…

ThinkBook15电脑开机后马上蓝屏不能使用怎么办?

ThinkBook15电脑开机后马上蓝屏不能使用怎么办&#xff1f;最近有用户使用的ThinkBook15电脑出现了开机之后屏幕蓝屏的情况。出现这个问题&#xff0c;是系统底层的故障&#xff0c;一般用户很难找出问题进行彻底解决。但是我们可以通过以下重做系统的方法来恢复电脑系统的使用…

阶段二11_面向对象高级_学生管理系统案例3

主要功能&#xff1a; 完成学生信息添加&#xff0c;修改和删除功能。 一.查看学生 思路&#xff1a; 图片&#xff1a;5_查看学生思路图.png 代码&#xff1a; StudentController[客服类中] //查找学生 private void findAllStudent() {//1.方法内部创建StudentService业…

Nacos 使用Postgresql数据库制作镜像

构建前提在 Nacos 2.2.0支持postgresql数据库基础上进行构建github地址&#xff1a;个人仓库编译打包源码mvn -Prelease-nacos clean package install -Dmaven.test.skiptrue若想跳过pmd和checkstyle检查请使用mvn -Prelease-nacos clean package install -Dmaven.test.skiptru…

Vue 3.0 组合式API 介绍 【Vue3 从零开始】

提示 在阅读文档之前&#xff0c;你应该已经熟悉了这两个 Vue 基础和创建组件。 在 Vue Mastery 上观看关于组合式 API 的免费视频。 通过创建 Vue 组件&#xff0c;我们可以将接口的可重复部分及其功能提取到可重用的代码段中。仅此一项就可以使我们的应用程序在可维护性和…

SAP ERP系统PP模块计划策略2050详解

SAP/ERP系统中面向订单生产的计划策略主要有20和50两个策略&#xff0c;这两个策略都是面向订单生产的计划策略&#xff0c;也是离散制造行业应用比较广泛的策略。它们之间最大差异就是在于20策略完全是由订单驱动&#xff0c;而50策略是预测加订单驱动&#xff0c;本文主要介绍…

【Leetcode 剑指Offer】第 14 天 搜索与回溯算法(中等)

文章目录剑指 Offer 12. 矩阵中的路径DFS剪枝面试题13. 机器人的运动范围剑指 Offer 12. 矩阵中的路径 典型矩阵搜索题 DFS剪枝 深度优先搜索&#xff1a; 可以理解为暴力法遍历矩阵中所有字符串可能性。DFS 通过递归&#xff0c;先朝一个方向搜到底&#xff0c;再回溯至上…

实现迭代回声服务器端/客户端

文章目录1.迭代服务器端/客户端2.迭代回声服务器端/客户端2.1 echo_server.c2.2 echo_client.c3.回声客户端存在的问题4.回声客户端问题解决方法1.迭代服务器端/客户端 之前讨论的 HelloWorld 服务器端处理完 111 个客户端连接请求即退出&#xff0c;连接请求等待队列实际没有…

唯品会盈利十年:韧性有余,冲劲不足

配图来自Canva可画唯品会在电商市场是一个特殊的存在&#xff0c;从2012年第四季度首次盈利至今&#xff0c;唯品会已经连续十年保持盈利。这十年&#xff0c;电商产业逐渐走向成熟&#xff0c;电商玩家新老接替成层出不穷&#xff0c;曾经家喻户晓的蘑菇街、聚美优品、苏宁易购…

Vue2.0开发之——购物车案例-Goods组件封装-商品数量的加减及总数量(53)

一 概述 Goods点击加减实现修改数量的原理Goods点击增加实现实例Goods点击-减少实现实例Footer计算商品总数量 二 Goods点击加减实现修改数量的原理 点击Counter组件里面的加减&#xff0c;修改Counter组件里面的数量Counter组件的数量变化时&#xff0c;Goods商品的数量相应…

leetcode-每日一题-807(中等,数组)

正常情况第一眼看这道题&#xff0c;看懂意思的话很简单就可以解出来。给你一座由 n x n 个街区组成的城市&#xff0c;每个街区都包含一座立方体建筑。给你一个下标从 0 开始的 n x n 整数矩阵 grid &#xff0c;其中 grid[r][c] 表示坐落于 r 行 c 列的建筑物的 高度 。城市的…

C++各类设计模式及实现详解

软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性&#xff1a;封装、继承、多态&#xff0c;真正领悟设计模式的精髓是可能一个漫长的过程&#xff0c;需要大量实践经验的积累。最近看设计模式的书&#xff0…

Jetpack Compose 中的重组作用域和性能优化

只有读取可变状态的作用域才会被重组 这句话的意思是只有读取 mutableStateOf() 函数生成的状态值的那些 Composable 函数才会被重新执行。注意&#xff0c;这与 mutableStateOf() 函数在什么位置被定义没有关系。读取操作指的是对状态值的 get 操作。也就是取值的操作。 从一…

Rasa 3.x 学习系列-Rasa [3.4.4] - 2023-02-17新版本发布

Rasa 3.x 学习系列-Rasa [3.4.4] - 2023-02-17新版本发布 任何人都可以学习Rasa之优秀Rasa学习资源推荐 欢迎同学们报名Gavin老师的Rasa系列课程,任何人都可以学习Rasa之优秀Rasa学习资源推荐: 1.NLP on Transformers高手之路137课 2 .Rasa 3.X 智能对话机器人案例开发硬核…