CUDA编程中影响性能的小细节总结
一、内存访问优化
- 合并内存访问:确保相邻线程访问连续内存地址(全局内存对齐访问)。
- 优先使用共享内存(Shared Memory)减少全局内存访问。
- 避免共享内存的Bank Conflict(例如,使用padding或调整访问模式)。
- 利用常量内存(Constant Memory)加速只读数据访问。
- 使用纹理内存(Texture Memory)或表面内存(Surface Memory)优化随机访问。
- 减少全局内存的原子操作(atomic operations)竞争。
- 使用向量化加载(如
float4代替4次float加载)。 - 预取数据到共享内存或寄存器(减少延迟)。
- 避免结构体填充(Struct Padding),手动对齐内存。
- 利用L1/L2缓存优化局部性访问。
- 使用
__restrict__关键字消除指针别名。 - 避免全局内存的未对齐访问(如地址非32/64字节对齐)。
- 利用只读缓存(Read-Only Cache)通过
__ldg()指令。 - 合并内存事务宽度(32/64/128字节对齐)。
- 减少内存访问冗余(如多次读取同一数据时缓存到寄存器)。
二、执行配置与并行策略
- 合理设置Block和Grid尺寸(典型BlockSize为128/256/512)。
- 最大化活跃线程束(Occupancy)数量(使用CUDA Occupancy Calculator)。
- 避免Block大小导致寄存器溢出(Register Spilling)。
- 使用动态并行(Dynamic Parallelism)时控制子内核粒度。
- 避免过度细分Grid(避免大量小Block导致调度开销)。
- 使用CUDA Stream实现异步并发执行。
- 优先使用线程束内同步(
__syncwarp()代替__syncthreads())。 - 避免线程束分化(Warp Divergence):分支条件尽量在Warp内统一。
- 利用线程束洗牌指令(Warp Shuffle)减少共享内存依赖。
- 使用协作组(Cooperative Groups)优化复杂同步模式。
三、指令与计算优化
- 使用快速数学函数(如
__expf()代替expf())。 - 避免双精度计算(除非必需),优先单精度(FP32)或半精度(FP16)。
- 利用Tensor Core加速矩阵运算(FP16/FP32混合精度)。
- 使用内联函数(
__forceinline__)减少函数调用开销。 - 避免整数除法和模运算(用位运算或乘法代替)。
- 使用
__ldg()指令优化只读全局内存访问。 - 利用
#pragma unroll手动展开循环。 - 避免不必要的类型转换(如
int与float频繁转换)。 - 使用融合乘加(FMA)指令优化计算(
a*b + c)。 - 减少条件分支(使用查表法或预测执行)。
四、寄存器与资源管理
- 限制每个线程的寄存器使用量(避免寄存器溢出)。
- 使用局部变量替代重复计算的中间结果。
- 避免过大的内核参数(通过常量内存或全局内存传递)。
- 减少共享内存的静态分配量(动态共享内存更灵活)。
- 优化线程的局部内存(Local Memory)使用(避免数组过大的栈分配)。
五、通信与同步优化
- 减少
__syncthreads()的使用次数。 - 使用原子操作的轻量级替代(如线程束内投票操作)。
- 优先使用块内通信(Shared Memory)而非全局内存。
- 避免全局同步(如
cudaDeviceSynchronize())。 - 使用异步内存复制(
cudaMemcpyAsync)与流重叠计算。
六、工具与调试
- 使用Nsight Compute分析内核性能瓶颈。
- 通过
nvprof或Nsight Systems分析时间线。 - 启用编译器优化选项(如
-O3、--use_fast_math)。 - 使用
#pragma unroll提示编译器展开循环。 - 检查PTX/SASS代码确认指令级优化。
- 使用
assert()验证内存访问合法性(避免非法访问导致性能下降)。
七、架构特性适配
- 利用Ampere架构的异步拷贝(Async Copy)特性。
- 为Hopper架构优化DPX指令加速动态规划。
- 针对Volta+架构优化独立线程调度(Independent Thread Scheduling)。
- 使用CUDA 11+的集群内存(Cluster Memory)特性。
- 适配不同GPU的Shared Memory/L1 Cache比例(如调整
cudaFuncSetCacheConfig)。
八、数值计算优化
- 使用快速近似函数(如
__saturate()代替手动截断)。 - 避免非规格化数(Denormals)计算(设置FTZ/DAZ标志)。
- 混合精度训练时使用
__half2加速半精度计算。 - 利用CUDA数学库(如CUBLAS、CUTLASS)的优化实现。
九、其他关键细节
- 避免主机-设备频繁通信(减少
cudaMemcpy调用)。 - 使用Zero-Copy内存避免显式拷贝(Pinned Memory)。
- 内核启动参数尽量通过常量或寄存器传递。
- 减少内核启动次数(合并多个操作为一个内核)。
- 使用模板元编程(Template Metaprogramming)减少运行时分支。
- 优化全局内存的访问模式(避免跨步访问)。
- 利用CUDA Graph捕获异步操作序列。
- 使用
__builtin_assume_aligned提示编译器内存对齐。 - 避免线程块内的资源竞争(如共享内存的读写冲突)。
- 利用
__launch_bounds__指定内核资源限制。
十、高级技巧
- 使用PTX内联汇编优化关键路径。
- 实现双缓冲(Double Buffering)隐藏内存传输延迟。
- 利用共享内存实现高效的归约(Reduction)操作。
- 使用Warp-level原语(如Warp Reduce/Scan)。
- 优化稀疏数据访问(如使用压缩格式)。
- 实现核函数融合(Kernel Fusion)减少中间结果存储。
- 使用持久化线程(Persistent Threads)处理动态负载。
- 针对数据局部性优化数据布局(如结构体数组转数组结构体)。
- 利用CUDA的MPS(Multi-Process Service)多进程共享GPU。
- 使用NVTX标记代码段以辅助性能分析。
十一、常见陷阱
- 误用共享内存导致Bank Conflict。
- 未初始化共享内存或寄存器变量。
- 线程同步不足导致竞态条件。
- 过度使用全局内存原子操作。
- 忽略编译器警告(如未使用的变量)。
- 错误的内存对齐导致性能下降。
- 未优化控制流(如多层嵌套循环)。
- 忽略线程束分化对性能的影响。
- 寄存器溢出导致Local Memory使用。
- 未适配目标GPU的架构限制(如最大线程数)。
十二、其他
- Power of Two: Choosing block sizes that are powers of two (e.g., 128, 256, 512) often leads to better performance due to alignment and coalesced memory accesses.
- Divisibility: Ensure that the total number of threads is divisible by the warp size (32) to avoid underutilization.
相关文章:
CUDA编程中影响性能的小细节总结
一、内存访问优化 合并内存访问:确保相邻线程访问连续内存地址(全局内存对齐访问)。优先使用共享内存(Shared Memory)减少全局内存访问。避免共享内存的Bank Conflict(例如,使用padding或调整访…...
thinkphp:部署完整项目到本地phpstudy
一、准备工作 首先准备一个thinkphp的项目文件;准备mysql数据库 二、小皮初步搭建 1、建立网站 在小皮界面,网站->创建网站->输入域名,选择PHP版本等 注:确保端口未被占用 2、将项目文件放入根目录 网站->管理->…...
Linux网络编程——基于ET模式下的Reactor
一、前言 上篇文章中我们已经讲解了多路转接剩下的两个接口:poll和epoll,并且知道了epoll的两种工作模式分别是 LT模式和ET模式,下来我们就实现的是一个简洁版的 Reactor,即半同步半异步I/O,在linux网络中,…...
大模型相关面试问题原理及举例
大模型相关面试问题原理及举例 目录 大模型相关面试问题原理及举例Transformer相关面试问题原理及举例大模型模型结构相关面试问题原理及举例注意力机制相关面试问题原理及举例大模型与传统模型区别 原理:大模型靠海量参数和复杂结构,能学习更复杂模式。传统模型参数少、结构…...
Redis List 的详细介绍
Redis List 的详细介绍 以下是 Redis List 的详细介绍,从基础命令、内部编码和使用场景三个维度展开: 一、基础命令 Redis List 支持双向操作(头尾插入/删除),适用于队列、栈等场景,以下是核心命令分类&a…...
使用virtualbox的HostOnly建立共享网络-实现虚拟机上网
目录 环境描述解决方案具体步骤1.新建一个virtual host-only ethernet adapter2.设置windows的wifi信号网络共享3.确认winows宿主网络信息3.1.wifi适配器的信息3.2.虚拟网卡的信息3.3.确认virtualbox中虚拟网卡的ip地址 4.虚拟机网卡设置5.虚拟机网络设置5.1.本地连接设置5.2.u…...
springboot+vue3+mysql+websocket实现的即时通讯软件
项目演示 即时通讯软件项目演示 业务架构 技术栈 后端 选用编程语言 Javaweb框架SpringBootdb MySQL 持久存储nosql 缓存 Redis全双工通信框架 WebSocket 前端 前端框架Vue3TypescriptUI样式 Css、ElementPlus网页路由 vue-router全双工通信框架Websocket 功能完成情况 已实…...
基于 Spring Boot 瑞吉外卖系统开发(五)
基于 Spring Boot 瑞吉外卖系统开发(五) 删除分类 分类列表中每条分类信息右侧提供了一个“删除”按钮,当需要将已经存在的分类信息删除时,可以通过单击“删除”按钮实现。 请求路径为/category,携带参数id…...
AES (高级加密标准)
原理详解 AES是一种对称加密算法,使用相同的密钥进行加密和解密。它采用替代-置换网络(SPN)结构,主要步骤包括: 密钥扩展:从初始密钥派生多轮密钥 初始轮:AddRoundKey(轮密钥加) 主轮ÿ…...
详解Windows(一)——系统盘下目录及文件详解
引言 你是否曾经好奇过电脑里那些神秘的文件夹都是干什么用的?为什么有些文件是.exe而有些是.dll?不同的图片格式.jpg和.png到底有什么区别?如果你对这些问题感到困惑,这篇文章就是为你准备的。今天,我们将以通俗易懂…...
基于Spring MVC的客户端真实IP获取方案解析
文章目录 基于Spring MVC的客户端真实IP获取方案解析概述核心方法解析代码实现工作流程 IP获取优先级策略IP有效性验证异常处理与日志使用场景注意事项扩展建议 基于Spring MVC的客户端真实IP获取方案解析 概述 在Web应用开发中,准确获取客户端真实IP地址是常见的…...
【Web部署问题】在Tomcat中部署web项目出现http状态-404 -未找到详细解决方案
部署完tomcat记得在选中要运行的工件。 如果没有工件,或者工件有缺失东西,去这里配置工件,...
Linux——Shell编程之正则表达式与文本处理器(笔记)
目录 基础正则表达式 1:基础正则表达式示例 (4)查找任意一个字符“.”与重新字符“*” (5)查找连续字符范围“{ }” 文本处理器 一、sed工具 二、awk工具 (1)按行输出文本 (2࿰…...
Linux 进程控制(自用)
非阻塞调用waitpid 这样父进程就不会阻塞,此时循环使用我们可以让父进程执行其他任务而不是阻塞等待 进程程序替换 进程PCB加载到内存中的代码和数据 替换就是完全替换当前进程的代码段、数据段、堆和栈,保存当前的PCB 代码指的是二进制代码不是源码&a…...
05-DevOps-Jenkins自动拉取构建代码
新建Gitlab仓库 先在Gitab上创建一个代码仓库,选择创建空白项目 安装说明进行填写,然后点击创建项目 创建好的仓库是空的,什么都没有 新建一个springboot项目,用于代码上传使用。 只是为了测试代码上传功能,所以代码…...
【Spring学习】
Spring学习 简介 Spring 是一个开源的 Java 企业级开发框架,最核心的特点是: IOC(控制反转)AOP(面向切面编程) 它有完整的生态: 🚀 Spring Boot:用于快速构建服务&a…...
网络基础与 HTTP 协议
一、网络基础 (一)TCP/IP 协议族 TCP/IP 协议族是互联网通信的核心协议,它包含了多个层次的协议,共同协作实现网络通信。 1. IP 协议 IP(Internet Protocol)协议位于网络层,主要负责将数据包…...
SRS transcode支持 h264_nvenc 硬件解码方案
文章目录 SRS transcode支持 h264_nvenc 硬件解码方案1、修改文件2、重新编译3、使用 SRS transcode支持 h264_nvenc 硬件解码方案 SRS 是开源的流媒体服务,但在使用 GPU 服务器时,想要通过硬件加速,目前官方是不支持的,所以简单…...
阿里云服务器搭建开源版禅道
一,下载地址:禅道11.5版本发布,主要完善细节,修复bug,新增动态过滤机制 - 禅道下载 - 禅道项目管理软件 下载地址二: 禅道21.6.stable 实现旧编辑器撰写的文档无感升级至新版编辑器 - 禅道下载 - 禅道项目…...
【刷题Day21】TCP(浅)
说说 TCP 的四次挥手? TCP的四次挥手事用于安全关闭一个已建立的连接的过程,它确保双方都能完成数据传输并安全地释放连接资源。 简述步骤: 第一次挥手(FIN --> ACK):客户端主动关闭连接,…...
怎么用面向对象和状态机架构,设计一个通用的按键检测功能?
说起按键检测,在座的各位,哪个没被它折磨过? 我刚入门时,为了实现一个简单的按键功能,硬生生写了几十行代码,各种 if...else 嵌套,逻辑绕得我自己都头晕。 更可气的是,辛辛苦苦写完…...
Java基础系列-LinkedList源码解析
文章目录 简介LinkedList 插入和删除元素的时间复杂度?LinkedList 为什么不能实现 RandomAccess 接口? LinkedList 源码分析Node 定义初始化获取元素插入元素删除元素遍历链表 简介 LinkedList 是一个基于双向链表实现的集合类,经常被拿来和…...
day47—双指针-平方数之和(LeetCode-633)
题目描述 给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a^2 b^2 c 。 示例 1: 输入:c 5 输出:true 解释:1 * 1 2 * 2 5示例 2: 输入:c 3 输出:f…...
qwen 14B模型配置文件,层名称weight_map. 28GB
qwen 14B模型配置文件,层名称weight_map. 28GB 目录 qwen 14B模型配置文件,层名称weight_map. 28GBmetadata(元数据)weight_map(权重映射)lm_head.weightmodel.layersmlp.{proj_type}.weightpost_attention_layernormself_attn.{proj_type}.{bias_or_weight}model.norm.w…...
LVDS系列8:Xilinx 7系可编程输入延迟(一)
在解析LVDS信号时,十分重要的一环就是LVDS输入信号线在经过PCB输入到FPGA中后,本来该严格对齐的信号线会出现时延,所以需要在FPGA内部对其进行延时对齐后再进行解析。 Xilinx 7系器件中用于输入信号延时的组件为IDELAYE2可编程原语࿰…...
【Oracle专栏】函数中SQL拼接参数 报错处理
Oracle相关文档,希望互相学习,共同进步 风123456789~-CSDN博客 1.背景 最近同事反馈了一个很奇怪的问题,即有一个函数,入参是当前年月,主要作用是通过SQL语句将不合规的数据插入到指定表中,插入数据时带上入参的年月参数。当前问题:单独测试SQL没有问题可以执行成功,…...
自然语言处理(NLP)领域大图
以下是一份自然语言处理(NLP)与大模型领域的领域大图,涵盖技术框架、发展脉络、交叉融合点和应用场景的完整解析: 1. 核心技术体系 基础分析层级 词法分析:分词、词性标注、命名实体识别句法分析:依存句法…...
【Linux我做主】GDB调试工具完全指南
Linux下GDB调试工具完全指南:25个核心命令详解与实战示例 github地址 有梦想的电信狗 前言 GDB(GNU Debugger)是Linux开发中不可或缺的调试工具,尤其在定位代码逻辑错误和内存问题时表现卓越。本文基于实际开发经验࿰…...
Pycharm 如何删除某个 Python Interpreter
在PyCharm中,点击右下角的“Interpreter Settings”按钮,或者通过菜单栏选择“File” > “Settings”(macOS用户选择“PyCharm” > “Preferences”)。在设置窗口中,导航到“Project: [Your Project Name]” >…...
在 Debian 12 中恢复被删除的 smb.conf 配置文件
https://forum.ubuntu.com.cn/viewtopic.php?t494763 本文结合ai输出,内容中可能有些错误,但确实解决了我的问题,我采取保留完整输出的方式摘录。 在 Debian 12 中恢复被删除的 smb.conf 配置文件,需结合 dpkg 和 ucf(…...
