cuda编程入门07

news2024/12/24 9:40:35

程序优化技巧

程序解读

在这里插入图片描述
在这里插入图片描述
降低256倍,但是后面数组长度还是不知道的
对1万的元素在此降低一定倍数

初始加速比为9.58左右

这里没有volatie

   if (tid < 32) sdata[tid] += sdata[tid + 32];
    __syncthreads();

在一个wrap内进行合并

   sdata[tid] += sdata[tid + 32];
    sdata[tid] += sdata[tid + 16];
    sdata[tid] += sdata[tid + 8];
    sdata[tid] += sdata[tid + 4];
    sdata[tid] += sdata[tid + 2];
    sdata[tid] += sdata[tid + 1];

加速比变为12
必须使用volitate修饰符
加速比要更快
或者去掉volatile,通过函数调用来实现,加速比变成13.25

cuda程序优化

最大化并行执行

在这里插入图片描述

两个向量间的运算容易计算出并行运算

LU不完全分解是一种对矩阵进行分解的方法,旨在将原始矩阵分解成一个下三角矩阵L和一个上三角矩阵U,即 A = L * U。与条件 (Fill-in) 是指在进行LU分解时,为了保持矩阵的稀疏性,在填充0元素的过程中引入的非零元素的数量。因此,与条件越小,矩阵的稀疏性就越好,效率也越高。常见的与条件为lu不完全分解包括:

  1. ILU(0):不考虑与条件的影响,只进行矩阵的LU分解,并且保持矩阵的稀疏性。

  2. ILU(k):使用一个参数k来控制矩阵的与条件。这种分解方法可以得到比ILU(0)更好的矩阵分解结果。

  3. MILU:基于对称不变性的因子分解方法,可以在保证矩阵稀疏性的同时,获得较好的与条件。

  4. Crout-ILU:采用Crout分解的方法,通过控制矩阵的填充次序,来实现不同的与条件控制。

  5. threshold-ILU:使用阈值方法来控制矩阵的填充次序,从而获得不同的与条件。

这些常见的与条件为LU不完全分解方法可以根据需要进行选择,以满足特定问题的求解要求。

在数值计算中,与条件(Condition Number)是用来描述矩阵或者函数在输入数据微小变化时输出结果的敏感程度的一个数值。在矩阵计算中,通常使用矩阵的谱范数(或2-范数)来定义矩阵的与条件数。

对于一个矩阵A,如果其逆矩阵不存在,则称其为奇异矩阵。此时,我们无法使用标准的求逆矩阵的方法来求解线性方程组 Ax = b。因此,我们需要使用其他求解方法来找到一个近似解x’。

如果矩阵A的条件数很小,说明在输入的b中存在微小的变化时,其对应的解x’的变化也很小,即输入数据的微小扰动对输出结果的影响很小,因此矩阵计算过程中误差较小。相反,如果矩阵A的条件数很大,说明在输入的b中存在微小的变化时,其对应的解x’的变化相对较大,即输入数据的微小扰动对输出结果的影响比较大,因此矩阵计算过程中误差较大。

因此,与条件数是评价矩阵在数值计算中的可靠性与稳定性的重要指标之一。在矩阵计算中,我们通常希望使用具有较小与条件数的矩阵来求解线性方程组,这样可以获得更加稳定和可靠的结果。

天然串行的,该类算法对三角解法进行并行难度非常大。

在设计时候,需要了解算法是并行的还是串行的,理解后根据算法结构能否通过数学手段让算法具有更高的并行性,

设计算法共享内存

线程同步

块间通信

在这里插入图片描述

在并行计算中,为了提高系统的性能,通常需要让通信和计算重叠,即在进行计算的同时,尽可能避免因等待通信而浪费时间,或者相反。以下是常用的技巧:

  1. Pipelining:将计算过程分为多个阶段,每个阶段对应一个计算任务和一个通信任务,这些任务可以同时执行,从而实现计算和通信的重叠。

  2. Message-Passing Protocol:采用异步通信协议,即发送方在发送消息后不需要等待接收方的响应,可以继续进行计算操作,从而实现通信和计算的重叠。

  3. Overlapping Communication and Computation (OCC):在计算过程中尽可能地多使用本地存储器,减少内存访问量,同时采用数据的异步预取保证数据在计算之前已经被加载到本地存储器中,从而实现通信和计算的重叠。

  4. SIMD机器模式:采用向量寄存器来进行计算,在向量寄存器中的数据可以同时被操作,从而实现计算和通信的重叠。

  5. Cacheing:合理地采用本地缓存技术,使得在数据读入之后可以进行多次的操作,从而减少因等待数据而浪费的时间,实现计算和通信的重叠。

这些技巧可以在不同的场景中应用,通过让计算和通信重叠,来提高系统的并行计算效率。

cpu和gpu相互间通信, 同步传输,等待执行完成后再执行, 异步,启动后不管了,往后执行

在这里插入图片描述

尽量让每个流多处理器保有更多的块

这句话可以理解为,在CUDA编程中,每个线程块所使用的资源最多只能占据总可用资源的一半。具体来说,CUDA设备包括多个Streaming Multiprocessor(SM),而SM包含多个CUDA核心。每个SM有一个有限的总共享内存、寄存器和线程数等资源。在CUDA程序中,我们需要合理地分配这些资源以实现高效的并行计算。

为了充分利用CUDA设备的资源,我们通常会将任务分割成多个线程块,并在每个线程块中启动多个线程来执行计算任务。然而,在每个线程块中,使用的共享内存、寄存器和线程数等资源也是受限的。因此,为了合理利用CUDA设备的资源,在设计CUDA程序时,需要考虑如何最大限度地利用每个线程块的资源,同时避免超过总可用资源的限制。

因此,根据上述原则,在CUDA编程中,通常需要确保每个线程块所使用的资源最多只占据总共享内存、寄存器和线程数等资源的一半,从而避免线程块之间互相影响,确保CUDA程序的正确性和高效性。这也是CUDA编程中一个重要的优化策略。

这句话的意思是,如果存在多个线程块(blocks)同时运行的情况,并且这些线程块不是都在等待同步(syncthreads())操作,那么多处理器可以保持繁忙状态。这是因为,在CUDA编程中,每个线程块都会被分配到一个Streaming Multiprocessor(SM)上运行,一个SM可以同时运行多个线程块。

当某个线程块需要等待其他线程块才能继续执行时,通常会使用同步操作syncthreads()来等待其他线程块完成工作。在等待期间,该线程块所在的SM可能没有可用的任务,从而导致浪费计算资源。但是,如果存在多个线程块同时运行的情况,即使其中一个线程块在等待同步操作,其它线程块仍然可以继续进行计算,从而使SM保持繁忙状态,提高GPU的利用率和计算效率。

因此,在设计CUDA程序时,我们需要充分利用多处理器的并行计算能力,尽可能避免线程块之间的互相等待,从而保持设备的最大利用率。这也是CUDA编程中的一个重要优化策略。

在这里插入图片描述
尽可能32的倍数
在这里插入图片描述
设计程序时尽量使 比例为1 当前处于活跃状态/ 最大活跃状态数目

在这里插入图片描述

内存优化使用

基本策略

在这里插入图片描述

尽量减少内存开销
保证程序可移植
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
coalesced float memory access 和 divergent warp 都是和CUDA程序中内存访问相关的问题。

coalesced float memory access 指的是在CUDA程序中,当一个线程块中的多个线程需要同时对连续的浮点型数据进行读取或写入时,如果这些线程在内存中访问的地址是连续的,就可以通过合并访问请求,使得设备能够一次性地读取或写入多个相邻的数据块,从而提高程序运行效率。这种一次性读取或写入多个数据块的访问方式称为“内存访问协同(Coalesced Memory Access)”,而相关的内存访问操作称为“协同内存访问”。

但是如果线程块中的不同线程访问的内存地址不是连续的,就会造成内存访问散乱、效率低下的问题。

divergent warp 则指的是,在一个线程块中,每个warp(32个线程构成的一组)内的线程需要同时执行同样的操作。但是,如果某个warp中的线程需要执行不同的操作,比如一个if语句中一部分线程需要执行if分支,另外一部分线程需要执行else分支,这就会导致该warp中的线程发生分歧(divergent),从而影响程序的并行性和计算效率。

因此,在CUDA程序中,为了提高内存访问效率和并行计算效率,需要尽可能地使用协同内存访问,并避免出现线程分歧。这也是CUDA编程中的一项重要优化策略。在这里插入图片描述

misaligned starting address 是指在CUDA程序中,如果一个线程块需要对内存中的某个数据区域进行读写操作,但是该数据区域的起始地址不是按照正确的对齐方式分配的,就会导致访问效率降低和内存访问异常的问题。

在CUDA编程中,为了提高内存访问效率,通常要尽可能地使用对齐的内存访问方式。在大多数计算机系统中,每个数据类型都有一个最小对齐字节数,即该数据类型的大小(以字节数为单位)或缓存行大小(通常是32或64字节)。因此,当从内存中读取一个数据时,该数据的地址应该是这个数据类型的倍数。如果数据的地址没有正确对齐,CPU或GPU需要进行多次内存访问才能读取该数据,从而导致性能损失。

在CUDA程序中,如果数据区域的起始地址没有按照正确的对齐方式分配,就会出现misaligned starting address的问题。解决这个问题的方法是,在程序中使用适当的内存分配函数(比如cudaMallocManaged()或cudaMallocPitch()等),使得分配的内存区域起始地址满足对齐要求。另外,在设计CUDA程序时,还可以通过合理的内存访问策略和对齐方式来提高程序的效率和性能。

不是16的倍数
在这里插入图片描述

共享内存

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
尽量使用计算而不是内存的读写
共享内存隐藏对全局内存的访问

优化

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
快速但精度要低一些

避免指令分化

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

【kali】使用VMware安装kali

目录 2、解压 3、安装 3.1 然后打开vm虚拟机&#xff0c;在文件菜单中选择打开 3.2 找到已解压的文件&#xff0c;选择一下文件 4、开启虚拟机&#xff0c;进入系统 1、下载 Get Kali | Kali Linux 我使用的是VMware12&#xff0c;所有下载下图 2、解压 3、安装 3.1 然后…

一文讲透彻!RobotFramwork测试框架教程(全能)

Robot Framwork在业界早已名声大振&#xff01;有很多刚学自动化测试的伙伴问我&#xff1a;有没有不需要编程就可以玩自动化的方法&#xff1f; 有吗&#xff1f;有的&#xff01;——Robot Framwork 我们今天就一篇文章&#xff0c;把它讲得明明白白&#xff01; 一、Robo…

使用php语言抓取网站商品详情代码及解析效果展示

抓取网站商品详情需要使用爬虫技术&#xff0c;可以使用 PHP 的 CURL 库来发送 HTTP 请求&#xff0c;然后解析 HTML 页面&#xff0c;获取商品详情信息。以下是一个简单的示例代码&#xff1a; <?php // 定义要抓取的商品 URL $url "https://example.com/produ…

华为OD机试 JavaScript 实现【密码强度等级】【牛客练习题】,附详细解题思路

一、题目描述 密码按如下规则进行计分&#xff0c;并根据不同的得分为密码进行安全等级划分。 1、密码长度&#xff1a; 5 分: 小于等于4 个字符 10 分: 5 到7 字符 25 分: 大于等于8 个字符 2、字母&#xff1a; 0 分: 没有字母 10 分: 密码里的字母全都是小&#xff08;…

执行修改方法返回值为0但是也没报错是什么原因

这篇文章仅仅记录 用springBoot加mybatis 搭建环境 一直没执行成功 百思不得其解 最后发现是controller中一个参数问题 一开始是这样 修改成这样就好了 数据库数据也能更新了 将param改成RequestParam 具体原因大家可以网上找找

jenkins显示gitlab的认证报错

描述 使用“List Git branches (and more)”功能&#xff0c;显示gitlab的分支或者标签。报错“org.eclipse.jgit.api.errors.TransportException: http://gitlab.test.com/userCenter/userCenterServer: not authorized” 排查与解决 使用的凭证再gitlab是Maintainer身份&…

c++ nlohmann/json

json为JavaScript object notation 是一种数据格式&#xff0c;逐渐替换掉了传统的xml 。json数据格式的属性名称和字符串值需要用双引号引起来&#xff0c;用单引号或者不用引号会导致读取数据错误。json的另外一个数据格式是数组&#xff0c;和javascript中的数组字面量相同。…

金融计量学第1节课:股指收益率序列统计特征

量化策略开发&#xff0c;高质量社群&#xff0c;交易思路分享等相关内容 导论与介绍 大家好&#xff0c;我是Le Chiffre 今天我们来为大家分享金融计量学系列内容&#xff0c;在松鼠量化3年多分享的内容中&#xff0c;大部分以量化策略为主&#xff0c;至今为止&#xff0c;…

EasyExcel导入导出

在项目开发中往往需要使用到数据的导入和导出&#xff0c;导入就是从Excel中导入到DB中&#xff0c;而导出就是从DB中查询数据然后使用POI写到Excel上。所以今天就为大家带来一款基于阿里EasyExcel的导入导出功能&#xff0c;开放了一个demo&#xff0c;以下是gitee地址&#x…

2.4 逻辑代数的基本定理

学习目标&#xff1a; 如果我要学习逻辑代数的基本定理&#xff0c;我会采取以下步骤&#xff1a; 1. 学习基本概念&#xff1a;首先&#xff0c;我会花时间了解逻辑代数的基本概念&#xff0c;如逻辑运算符&#xff08;合取、析取、否定等&#xff09;、真值表、逻辑等价性等…

Splashtop 与 Pax8 合作为 MSP 提供简化的远程支持解决方案

2023年4月27日 科罗拉多州丹佛 Pax8 是一个行业领先的云商务市场&#xff0c;该公司今天宣布将通过 Pax8 市场在全球推出其全新运营供应商 Splashtop。Splashtop 的远程访问、支持以及端点监控和管理解决方案极具成本效益&#xff0c;而且功能强大&#xff0c;可以助力托管服务…

Java使用JDBC连接PostgreSQL——使用maven,简单配置

目录 前置准备代码 前置准备 因为连接PostgreSQL需要先安装PG&#xff0c;所以以下给出PG的简单安装教程&#xff1a; window安装PostgreSQL 对应的建表语句&#xff1a; DROP TABLE IF EXISTS student; CREATE TABLE student (id serial NOT NULL,name varchar(100) NOT NU…

2023「光亚展」观察:规模空前,智能化趋势已势不可挡

6月12日&#xff0c;第二十八届广州国际照明展览会&#xff08;GILE&#xff09;及第二十届广州国际建筑电气技术展览会&#xff08;GEBT&#xff09;落下帷幕&#xff0c;共计汇聚了来自18个国家及地区的3,318家参展商&#xff0c;总展览面积达到了220,000平方米。 「智哪儿」…

ROS学习中遇到的问题以及解决方案

目录 问题1. 在使用xarco建立urdf时&#xff0c;运行joint_state_publisher/joint_state_publisher_gui报错问题2. 使用amcl定位时报No laser scan received警告&#xff0c; /scan 话题有数据&#xff0c;amcl也订阅了该话题。问题3. 运行.py文件报错问题4. 在roalaunch一个la…

Springboot整合Elasticsearch(一):Linux下安装 Elasticsearch 8.x

1、下载安装包&#xff0c;官方下载地址&#xff1a; Past Releases of Elastic Stack Software | Elastic elasticsearch-8.8.1-linux-x86_64.tar.gz 2、拷贝到 Linux 服务器上&#xff0c; 执行解压缩命令 安装包路径&#xff1a;/home/ELK_8.8.1 [rootlocalhost ELK_8.8.1]…

使用VNISEdit为PyQGIS程序制作一个安装包

引言 通常一个需要发布的程序都需要使用安装包进行安装&#xff0c;不可能给客户发送一套程序和依赖性文件&#xff0c;这样如果需要桌面添加软件的快捷方式&#xff0c;就得让客户自己添加&#xff08;因为每台电脑、每个用户的桌面路径是不一样的&#xff09;&#xff0c;非常…

改善客户体验是客户管理系统的重要价值

在如今竞争激烈的商业环境中&#xff0c;企业需要更好地了解客户需求、偏好和行为&#xff0c;以便提供更好的服务并保持客户忠诚度。这就是为什么越来越多的企业开始使用客户管理系统&#xff08;CMS&#xff09;来改善客户体验。 客户管理系统是一种专门设计用于帮助企业跟踪…

Day05 03-MySQL主从-主主原理与搭建详解

文章目录 第十六章 MySQL的系统架构&#xff08;主从架构&#xff09;16.1 MySQL集群架构的介绍16.1.1 主从架构介绍16.1.2 主从复制的原理 16.2 MySQL主从复制的实现16.2.1 环境说明16.2.2 主库配置16.2.3 从库配置16.2.4 主从复制测试 16.3 MySQL主主复制的实现16.3.1 主主复…

移植好U8g2图形库的STM32F407标准库工程模板,0.96寸OLED驱动程序

移植好U8g2图形库的STM32F407标准库工程模板&#xff0c;用的0.96寸OLED屏&#xff08;SSD1306&#xff09;&#xff0c;用硬件IIC驱动。 花了一晚上时间去移植。开发板主控MCU用的是STM32F407VET6&#xff0c;I2C接口用I2C1&#xff0c;SCL接PB6&#xff0c;SDA接PB7。 嵌入…

从分布式到微服务解密“架构”原理与实战笔记

分布式架构与微服务平台是当今IT界的关键技术&#xff0c;也是资深软件工程师和系统架构师必须掌握的核心技术。 微服务、云原生、Kubernetes、Service Mesh是分布式领域的热点技术&#xff0c;它们并不是凭空出现的&#xff0c;一定继承了某些“前辈”的优点。我们不仅要了解…