- 博客(115)
- 收藏
- 关注
原创 并发内核执行
本文摘要: 本文探讨了CUDA并发内核的调度与性能分析。首先介绍了GPU中SFU(特殊函数单元)的作用及其在Ada架构中的并行处理能力。通过实现包含tan函数的核函数,演示了多流并发执行,并使用cudaEvent测量耗时。重点讲解了Nsys性能分析工具的使用方法,包括权限配置、版本匹配和可视化分析技巧。此外,对比了OpenMP与pthread的并行编程特点,并展示了如何用OpenMP简化多线程任务分发。最后讨论了通过环境变量调整Hyper-Q连接数以优化并发,以及使用事件实现流间同步的技术。实验部分提供了代
2026-08-10 20:47:44
218
原创 流和事件概述
本文介绍了CUDA编程中流(Stream)和事件(Event)的概念及其应用。主要内容包括:1. 流的概念:作为独立任务队列管理异步操作,支持主机计算、数据传输和设备计算的并发执行。2. 流操作类型:异步数据传输(cudaMemcpyAsync)、核函数启动和其他主机发起的设备命令。3. 流优先级:通过cudaStreamCreateWithPriority创建不同优先级的流,影响内核执行顺序。4. 事件的作用:作为流中的标记点,用于计时和跨流同步,支持构建复杂依赖关系。5. 流同步机制:包括阻塞流与非阻塞
2026-08-05 23:31:27
196
原创 warp shuffle指令
摘要:本文介绍了CUDA中的线程束洗牌(Warp Shuffle)指令,这是一种高效的线程间通信机制。相较于通过共享内存或全局内存交换数据,Warp Shuffle允许线程直接访问同一线程束内其他线程的寄存器,从而显著提高性能。文章详细解析了四种基本洗牌指令形式:__shfl_sync(广播)、__shfl_up_sync(上移)、__shfl_down_sync(下移)和__shfl_xor_sync(异或交换),并通过代码示例展示了其具体应用场景,如数据广播、偏移移动、蝴蝶交换和归约操作。特别强调了Wa
2026-08-04 22:20:31
228
原创 常量内存和只读缓存
本文对比了GPU中的常量内存与只读缓存的特性与使用场景。常量内存(constant)位于片外DRAM,具有64KB容量,通过cudaMemcpyToSymbol初始化,其常量缓存支持单周期广播,适合全warp读取同一地址的小数据场景(如卷积核)。只读缓存是L1缓存的一种优化模式,通过__ldg()或const __restrict__触发,不限制数据量,能防止频繁数据覆盖,适合大规模只读数据(如查找表)。实验显示,两者性能接近,但只读缓存波动较大。常量内存适合统一访问的小数据,只读缓存则适合分散访问的大数据
2026-08-03 23:20:14
232
原创 减少全局内存的访问
本文摘要:本文对比了CUDA中全局显存与共享内存在归约和转置操作中的性能差异。在归约操作中,全局显存版本存在访存效率低和占用率不足的问题,通过使用共享内存和循环展开优化,性能提升显著。转置操作部分显示,即使存在bank冲突,共享内存版本仍比全局显存高效,而通过padding和索引交换进一步优化后性能更佳。实验表明,合理配置块大小(如16×16)能有效提高占用率,但实际性能受硬件环境和噪声影响,需多次测试验证。优化关键在于平衡计算强度、访存效率和线程块配置。
2026-08-03 18:19:21
290
原创 共享内存概述
│ [寄存器文件] 256 KB (独立) ││ ││ [L1 / 共享内存] 128 KB (共享,可配置划分) ││ │ └── (内部划分:共享内存 + L1 数据缓存) ││ │ └── **L1 数据缓存同时承担以下角色:** ││ │ 1. 普通 L1 缓存 (全局内存、局部内存的读写) ││ │ 2. 纹理缓存 (纹理请求的缓存,逻辑通路) ││ │ 3. 只读缓存 (通过 __ldg() 触发的只读缓存通路) ││ 4. 常量缓存 ││ │。
2026-07-31 19:10:15
205
原创 核函数可达到的带宽
本文深入探讨了CUDA核函数优化中的带宽利用问题,重点分析了矩阵转置操作的性能优化策略。文章首先介绍了GDDR6显存的工作原理,包括其物理结构、地址交织和bank访问机制。然后通过矩阵转置案例,比较了行读取与列读取两种方法的性能差异,发现写操作的合并比读操作的合并更为关键。进一步提出了对角转置优化方法,通过调整线程块与数据块的映射关系来分散显存访问到不同channel,从而提高并行性。实验结果显示,在RTX 4060显卡上,行读列写的组合方式性能最佳,比最差情况快约60%。文章最后指出,优化核心在于提高显存
2026-07-28 21:52:55
210
原创 内存访问模式
本文探讨了CUDA编程中全局内存访问的优化策略。通过分析GPU内存架构和访问机制,重点阐述了两种关键优化技术:对齐访问和合并访问。文章详细解释了为什么256字节对齐是显存访问的基础保证,并展示了如何通过线程束的组织方式实现高效合并访问。 实验部分对比了结构体数组(AoS)和数组结构体(SoA)两种数据布局的性能差异,结果显示SoA布局因更好的内存连续性可获得约1.5-1.8倍的性能提升。文章还深入分析了现代GPU架构中的缓存机制,包括L1/L2缓存的工作流程和写分配策略的优化考量。 最后强调在实际编程中应根
2026-07-23 21:47:04
370
原创 CUDA内存管理的终极秘密
本文探讨了CUDA中的内存管理技术,包括手动内存分配、固定内存、零拷贝内存、统一虚拟寻址(UVA)和统一内存(UM)。CUDA采用手动内存管理而非自动管理,以提供更优的性能控制。固定内存通过锁定物理页提升DMA传输效率;零拷贝内存允许GPU直接访问主机内存;UVA实现CPU/GPU地址空间统一;UM在UVA基础上实现数据自动迁移。文章通过实验对比不同技术的性能特点,并分析了各自的适用场景:固定内存适合频繁大数据传输,零拷贝内存适合随机访问,UM适合超大数据集。开发者需根据数据规模、访问模式和硬件限制选择合适
2026-07-09 18:44:27
198
原创 CUDA内存模型详讲
本文深入探讨了CUDA编程中的内存模型及其优化策略。文章首先强调了内存带宽对GPU性能的关键影响,指出即使GPU算力强大,若数据供给不足也会成为性能瓶颈。随后详细分析了CUDA内存层次结构的特点,包括寄存器、共享内存、常量内存、纹理内存和全局内存等不同存储层级的特性与应用场景。 重点介绍了共享内存的bank conflict问题及解决方案,通过实验对比了padding优化前后性能差异。文章还解析了常量内存的单周期广播机制和纹理内存的专用缓存特性,强调根据不同访问模式选择合适内存类型的重要性。最后总结了各类内
2026-06-27 17:12:37
302
原创 GPU动态并行:父子网格的内存共享与同步
本文介绍了CUDA动态并行技术,主要内容包括: 动态并行概念:允许GPU核函数内部启动新核函数,实现递归调用,形成父子网格关系 执行模型:父网格需等待所有子网格完成才能结束,存在隐式同步机制 示例程序:展示递归调用的"helloworld"实现,包含网格配置和多层级调用 内存规则:父子网格共享全局内存和常量内存,但局部内存独立,存在弱一致性特点 编译要求:需要指定计算能力3.5+,链接设备运行时库,生成可重定位设备代码 动态并行扩展了GPU编程能力,支持更灵活的并行模式,但需要注意同步和
2026-06-27 17:11:51
196
原创 GPU性能优化:展开归约压榨最后一滴性能
本文探讨了如何通过循环展开和减少分支指令来优化GPU归约操作的性能。核心思路包括:1)通过预归约减少block数量,降低同步开销;2)使用循环展开技术减少循环控制指令;3)针对最后64个数据块采用无分支的完全展开策略。实验数据表明,展开策略能使性能提升近2倍,其中reduceUnrollWarp8版本将同步等待时间占比降至11.33%。文章详细分析了线程束分化、访存合并和同步机制对性能的影响,并比较了不同展开策略的优化效果。最终提出的完全展开版本通过编译期优化消除了循环控制指令,进一步提升了执行效率。这些优
2026-06-23 17:26:58
550
原创 divergence优化和“warp级并行掩盖延迟的能力“权衡
本文探讨了CUDA并行归约算法的优化策略。首先分析了朴素归约的两个主要瓶颈:线程束分化和访存效率问题,通过相邻分配和交错配对两种方式分别优化。实验发现,相邻分配优化(reduceNeighboredLess)能显著减少线程束分化(从28.4%降至0.74%),但会恶化访存合并效果(sector/request从2.67升至14.01);交错配对优化(reduceInterLeaved)则能同时保持较低的分化率和良好的访存合并(sector/request为3.58)。针对不同数据规模(1<<24
2026-06-23 17:13:05
193
原创 如何组织一个并行程序
本文摘要: 文章系统介绍了CUDA编程中线程索引的建立与并行计算优化方法。首先解释了如何通过块和线程的全局/局部坐标计算唯一索引,实现二维矩阵加法的并行处理,并对比不同线程组织模式对性能的影响(最高可达25倍差异)。随后详细讲解了硬件信息查询方法,包括设备数量获取、属性查询(计算能力、显存、SM数量等)、PCIe总线信息获取及CUDA版本检测。最后介绍了nvidia-smi工具的使用技巧,为后续基于硬件特性的参数优化奠定基础。全文强调通过反复试验和硬件适配来寻找最佳配置方案。
2026-06-12 19:45:00
222
原创 CUDA程序效率如何计算以及工具如何使用
本文介绍了在C语言和CUDA程序中测量代码效率的方法。对于C语言,可以使用clock()函数测量CPU运行时间。在CUDA中,需使用gettimeofday()测量真实时间,并配合cudaDeviceSynchronize()确保GPU任务完成。文章还展示了如何封装计时函数,并通过向量加法的例子比较不同grid/block配置的性能差异,指出数据布局和任务分配对性能的关键影响。最后介绍了NsightSystems和NsightCompute两款性能分析工具的使用场景和基本命令,强调了解硬件性能上限的重要性。
2026-06-11 22:00:00
197
原创 CUDA编程模型入门
CUDA编程模型摘要 CUDA编程模型是连接应用程序与GPU硬件的桥梁,包含以下核心组件: 编程结构:区分主机(CPU)和设备(GPU)内存,通过PCIe总线通信,早期版本需显式内存拷贝。 内存管理: 使用cudaMalloc分配设备内存 cudaMemcpy实现主机与设备间数据传输 提供错误检查宏CHECK简化调试 线程模型: 层次化结构:网格(Grid)→线程块(Block)→线程(Thread) 内置变量:blockIdx、threadIdx定位线程,blockDim、gridDim获取维度 线程块内
2026-06-11 18:00:00
211
原创 探秘异构计算:CPU与GPU的完美协作
本文摘要: 文章系统介绍了异构计算的核心概念与技术实现。首先区分了同构(单一架构)与异构(多架构协同)系统的差异,重点分析了CPU+GPU异构架构的优势:CPU负责逻辑控制,GPU处理并行计算。文章详细阐述了PCIe总线瓶颈问题及优化策略,并通过硬件结构对比说明CPU与GPU的设计哲学差异。随后介绍了NVIDIA计算平台分类和CUDA技术架构的三层体系(编程语言、库/中间件、应用层),并以Hello World示例演示了CUDA编程模型。最后强调高效GPU编程的关键在于理解内存层次和线程组织模型,而非语法本
2026-05-30 20:17:42
804
原创 并行计算的本质:为何需要它???
本文探讨了并行计算的核心概念与技术,从软件和硬件双视角解析高并发系统设计。软件层面区分了指令并行(任务并行)和数据并行(如CUDA的SIMD架构),重点分析块划分与周期划分两种数据分配策略的优劣。硬件层面介绍SISD/SIMD/MISD/MIMD四类架构,指出CPU是MIMD架构而GPU本质是SIMD。文章强调优化延迟、带宽和吞吐量的重要性,并对比分布式内存与共享内存系统的特性,最终揭示软硬件协同进化是推动并行计算发展的核心动力,为开发者提供架构选型与优化方向的理论基础。
2026-05-30 20:16:49
346
原创 多线程redis下如何解决aof重写和rdb持久化的数据一致性问题
本文针对多线程环境下Redis AOF重写面临的数据一致性问题,提出了三种解决方案:1)多版本并发控制(MVCC),通过版本链实现读写分离;2)美团Forkless技术,采用分片化数据结构和分段拷贝实现无fork快照;3)分析fork+锁方案的死锁风险,指出其不可行性。重点阐述了Forkless技术的五个阶段实现原理,包括分片拷贝、脏key追踪和原子补拷等核心机制,证明其能达到与fork相同的强一致性,同时避免内存翻倍和主线程阻塞。最后指出传统fork方案在多线程环境下的致命缺陷,包括显式锁和标准库隐式锁导
2026-05-21 22:20:16
433
3
原创 多线程redis项目之aof
本文深入解析Redis的AOF持久化机制,从文件格式、与RDB的互补性到源码实现。AOF作为文本文件采用RESP协议存储命令,便于人工查看和编辑;而RDB是二进制格式,体积更小。两者在数据安全、恢复速度和空间占用上各有优劣,通常建议同时启用。文章详细分析了AOF的三种刷盘策略(always/everysec/no)、重写机制及Linux优化技巧(如sync_file_range和posix_fadvise),并对比了Redis官方实现与异步队列方案的差异。最后提出基于分片和脏key追踪的forkless重写
2026-05-21 22:15:38
708
原创 网络编程时内核究竟做了什么???
本文摘要:文章通过简化内核代码,解析了TCP/IPv4套接字创建和连接的核心流程。主要步骤包括:1) socket()创建套接字结构体并关联文件描述符;2) bind()绑定IP和端口到内核哈希表;3) listen()建立监听状态和连接队列;4) connect()发起三次握手;5) accept()从全连接队列创建新套接字。每个步骤详细说明了内核如何管理套接字资源、维护状态和队列,以及用户态与内核态的交互过程,揭示了TCP连接建立的核心机制。
2026-05-19 11:40:07
422
原创 多线程redis项目之rdb
Redis持久化策略解析:RDB实现机制与优化思考 本文深入探讨了Redis的RDB持久化机制,重点分析了其二进制序列化方案的设计原理。RDB采用紧凑的自描述二进制格式,通过类型标记、长度前缀等实现高效存储,相比文本格式可节省30%-50%空间。文章详细解释了为何Redis选择fork子进程而非多线程方案来保证数据一致性,并剖析了LZF压缩算法在线应用的实现细节。通过rio抽象层的设计案例,展示了如何通过架构演化实现I/O操作的解耦。虽然当前简化版采用文本格式实现,但作者明确指出二进制格式在空间效率、解析速
2026-05-18 11:33:33
574
原创 redis项目之命令解析器
Redis命令处理机制解析:Redis采用客户端-服务器架构,通过RESP协议通信。服务器端使用哈希表存储命令元信息(redisCommand结构体),实现O(1)查找。命令处理流程包括RESP解析、参数校验、权限检查等8类关键校验,确保命令合法性。系统采用分层设计,网络层负责数据传输,命令分配器处理协议转换和调度,业务层执行具体操作。支持同进程(函数调用)和跨进程(TCP通信)两种部署方式,适用于不同规模场景。核心特点是高效命令查找、严格参数校验和灵活部署架构。
2026-05-18 11:29:53
457
原创 多线程redis项目基石
Redis存储类型核心设计总结:采用链地址法哈希表,通过渐进式rehash避免扩容阻塞,使用MurmurHash2优化哈希分布。过期策略结合惰性删除和定期扫描,持久化提供RDB快照和AOF命令日志两种方式。跳表实现通过概率晋升(p=0.25)建立多级索引,平衡查询性能与内存消耗。时间获取采用steady_clock保证单调性,容器操作使用find_if进行高效查找。整体在数据结构、内存管理和持久化等方面进行了深度优化。
2026-05-14 17:51:58
407
原创 高并发内存池如何实现
本文实现了一个高效的高并发内存池,参考Google TCMalloc设计思想,解决传统glibc malloc在多线程环境下的锁竞争与内存碎片问题。系统采用三级架构:ThreadCache(线程独享无锁分配)、CentralCache(中心缓存桶锁管理)、PageCache(页缓存合并碎片)。关键技术包括:定长内存池减少内碎片、基数树实现O(1)页号映射、慢启动算法平衡分配效率。测试表明相比ptmalloc性能提升20%,特别适合高频小对象分配场景。项目通过TLS隔离线程资源、分级对齐策略(8B-8KB)、
2026-05-14 17:47:40
497
原创 mini-redis项目之Resp协议
本文详细解析了Redis协议(RESP)的格式规范与实现原理,重点介绍了6种RESP数据类型及其解析规则。文章深入探讨了C++17特性在Redis实现中的关键应用,包括string_view的零拷贝特性、optional的安全空值处理、enum class的强类型枚举等。同时对比了传统C++实现与现代C++17方案的性能差异,阐述了Redis协议解析的最佳实践,包括数值转换优化、非法字符处理机制等。通过分析底层函数选择(如memchr vs find)和语法特性(如逗号表达式),揭示了Redis高性能协议解
2026-03-14 21:01:18
484
原创 背包问题详解:从入门到精通
摘要:背包问题是动态规划的经典分支,核心是在有限约束下选择物品组合以优化目标值。主要分为01背包(物品选0/1次)、完全背包(物品无限选)、多重背包(物品有限制)和多维背包(多约束条件)四种类型。所有背包问题遵循「状态定义→转移逻辑→初始化」的统一框架,差异在于物品选择规则和约束维度。解题关键在于状态转移方程的设计,通常采用二维/三维DP数组,并通过滚动数组优化空间。典型应用包括分割等和子集、零钱兑换等问题。背包问题的核心是识别问题特征并正确转化为对应的背包模型。
2026-03-12 11:00:00
473
原创 双数组DP:算法刷题必备技巧
双数组DP是处理两个数组/字符串关联问题的核心算法,常用于求解最优匹配、最长公共子序列、编辑距离等问题。其核心是定义二维状态dp[i][j],表示数组A前i个元素和数组B前j个元素的最优解。解题步骤包括:初始化边界条件(处理空串)、状态转移(根据元素匹配情况推导)、返回结果dp[n][m]。典型例题包括1143最长公共子序列、712最小ASCII删除和等,其中子数组问题需注意连续特性。关键技巧是采用1-based下标简化边界处理,并可通过空间优化压缩为1维DP表。掌握状态定义和转移逻辑是解决此类问题的核心。
2026-03-09 10:00:00
397
原创 回文子串与子序列dp全解析
本文系统梳理了回文子串与回文子序列的核心算法。回文子串强调连续性,常用中心扩展法(O(n²)时间)或动态规划;回文子序列则必须使用区间DP。动态规划通过构建dp表存储回文信息,适用于分割、计数等复杂问题。关键区别在于连续性与状态转移方式:子串两端相同且中间回文则为真,子序列则需比较左右边界。典型例题包括统计回文子串数、最长回文子串/序列等,预处理回文信息可显著优化分割类问题的求解效率。
2026-03-07 18:30:00
437
原创 子序列的DP奥秘
本文系统总结了子序列问题的解题框架与核心技巧。主要内容包括: 子序列与子数组的核心区别:子序列不要求连续,导致解法复杂度更高 常见题型分类: 最长类(LIS、等差序列等) 计数类(等差数列划分等) 存在性类 构造类 通用解题方法: 动态规划是核心(90%题目适用) 状态定义技巧(以i结尾而非前i个) 哈希优化(避免O(n²)复杂度) 避免暴力枚举(子序列总数2ⁿ必超时) 关键避坑点: 下标越界处理 重复元素处理 大数溢出问题 边界条件处理 典型题目分析:最长递增子序列、摆动序列、等差数列等题目的解法对比与优
2026-03-07 12:00:00
552
原创 动态规划核心:数组问题实战
本文总结了动态规划在数组问题中的核心应用,重点分析了连续子数组/子序列问题的解法框架。通过6道典型例题(最大子数组和、环形子数组、乘积最大子数组等),揭示了这类问题的通用解法:以dp[i]表示以i结尾的子数组最优解,状态转移分为"延续前状态"或"重新开始"两种情况。针对乘积类问题需同时维护最大/最小值状态,计数类问题要注意去重处理。文章提炼出子数组DP的三要素:状态定义必含"以i结尾"、转移依赖前状态、初始化要考虑边界条件,为处理连续子数组问题提供
2026-03-04 21:39:11
478
原创 简单多状态dp问题:从按摩师到股票买卖
本文总结了力扣上多状态动态规划问题的解题思路,主要包含按摩师、打家劫舍、股票买卖等经典题型。通过分析状态定义、转移方程和边界条件,提出五步解题法:1)定义互斥状态;2)推导状态转移;3)初始化边界;4)确定结果范围;5)优化空间/时间。重点强调了状态机的思维模式,将问题抽象为状态节点间的转移过程,并指出常见错误如状态定义模糊、边界处理不当等。文章提供了模板化解决方案,适用于90%的简单多状态DP问题,帮助读者建立系统性的解题框架。
2026-03-04 12:00:00
425
原创 Redis缓存深度解析:20%数据应对80%请求
Redis作为高性能内存数据库,主要应用于数据存储、缓存和消息队列三大场景。在缓存应用方面,Redis通过存储热点数据有效拦截80%的请求,显著降低MySQL等关系型数据库压力。文章详细分析了Redis的缓存策略,包括内存淘汰机制(LRU/LFU)、缓存预热以及应对缓存穿透、雪崩和击穿的解决方案。同时深入探讨了分布式锁的实现,包括SETNX命令、看门狗机制和Lua脚本的原子操作,并比较了Redlock算法与业务兜底方案。最后指出Redis集群模式下锁丢失问题的处理策略,强调在性能与可靠性之间的权衡选择。
2026-02-25 21:34:24
804
原创 Redis集群:从单点故障到高可用的进阶之路
Redis高可用架构演进 单点问题 单点部署存在可用性和性能瓶颈,服务器宕机导致服务不可用,硬件资源限制并发处理能力。 主从模式 主节点处理写请求,从节点复制数据并处理读请求 提升读性能和数据冗余,但主节点仍是单点 哨兵模式 引入哨兵进程监控节点状态 实现自动故障转移,主节点宕机时自动选举新主 但仍存在单点写瓶颈和存储限制 集群模式 采用哈希槽分区算法(16384个槽位) 数据分片存储在多个主节点,实现水平扩展 主节点故障时自动转移槽位 支持多主节点同时写入,解决单点写问题 三种模式逐步解决了单点故障、自动
2026-02-25 10:50:04
1205
原创 揭秘Redis事务:弱原子性的背后逻辑
事务是一组操作的集合,确保操作的完整性——要么全部成功,要么全部失败。Redis事务与MySQL事务的主要区别在于:Redis仅支持弱原子性(语法错误全不执行,运行时错误部分执行)、无回滚机制、依赖业务逻辑保证一致性,采用乐观锁(WATCH)而非悲观锁。Redis事务适合简单批量操作,不适合强一致性场景。通过Lua脚本可实现原子性操作解决超卖问题,相比WATCH机制性能更高。Redis本身不保证一致性,需开发者自行维护业务逻辑。
2026-02-18 20:00:00
1211
原创 Redis持久化策略与实战指南
摘要:Redis提供RDB和AOF两种持久化机制。RDB通过定时生成内存快照实现高效备份,但可能丢失两次快照间的数据;AOF通过记录所有写命令确保数据完整性,但文件体积较大。4.0+版本支持混合持久化,结合两者优势。Redis还支持冷备(RDB文件拷贝)和热备(AOF实时记录)。实际应用中,AOF(混合模式)适合热备保证低丢失,RDB适合冷备和快速恢复。系统服务管理可通过systemctl操作Redis服务,包括启动、停止、状态查看等。持久化策略应根据业务对数据安全性和恢复速度的需求进行选择。
2026-02-18 17:00:00
846
原创 muduo项目排查错误+测试
文章摘要:本文详细记录了HTTP服务器开发与测试的全过程。首先排查了服务器初始化问题,发现Acceptor未正确监听导致阻塞。接着分析了浏览器双重TCP连接行为及favicon.ico请求处理机制。针对路径解析的段错误问题,修正了子字符串分割逻辑。测试了连接超时管理,提出将释放操作延迟到任务池执行的解决方案。通过PUT请求验证了大文件传输的完整性,MD5校验确认功能正常。最后使用Webbench进行压力测试,在2核2GB环境下达到约1400QPS的稳定处理能力,5000并发时仍保持100%成功率,验证了服务
2026-02-06 21:45:39
1126
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅