自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(61)
  • 收藏
  • 关注

原创 剑指offer题目总结(python)

剑指offer题目总结(python)题目分类一、位运算     [15. 二进制中1的个数](#面试题03.数组中重复的数字)二、二叉树三、字符串四、数组五、栈和队列六、链表七、哈希表八、递归九、动态规划十、二分法十一、双指针十二、回溯法十三、dfs、bfs遍历面试题03. 数组中重复的数字新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚

2020-07-20 22:06:17 1968

原创 长延迟流水线:当性能追求遭遇架构陷阱

性能追求(通过深流水线提升频率)与正确性保障(冒险避免)的永恒对抗。RISC架构通过约束指令语义(如固定读时机、简单寻址模式)简化冒险处理。ARM Cortex-A78的13级流水线相对保守,但换来了可预测的性能和能效比。CISC架构(如x86)则依赖复杂的微架构:x86指令被解码为多条微操作,通过巨大的ROB(Golden Cove达512项)和物理寄存器堆(Zen 5浮点PRF 384项)维持乱序执行效率。

2026-04-29 22:07:59 377

原创 长延迟流水线:当性能追求遭遇架构陷阱

性能追求(通过深流水线提升频率)与正确性保障(冒险避免)的永恒对抗。RISC架构通过约束指令语义(如固定读时机、简单寻址模式)简化冒险处理。ARM Cortex-A78的13级流水线相对保守,但换来了可预测的性能和能效比。CISC架构(如x86)则依赖复杂的微架构:x86指令被解码为多条微操作,通过巨大的ROB(Golden Cove达512项)和物理寄存器堆(Zen 5浮点PRF 384项)维持乱序执行效率。

2026-04-14 11:38:44 907

原创 ROB(Reorder Buffer):重排序缓冲区

特性统一PRF (现代)数据存储ROB entry独立PRF退休操作数据搬运更新映射功耗较高较低复杂度较低较高主流应用历史/嵌入式现代高性能CPUROB的核心价值支持乱序执行,提升IPC保证顺序提交,满足精确中断支持推测执行,提升分支预测效率关键洞察ROB大小决定了指令窗口,影响乱序执行深度现代CPU从ROB-based转向统一PRF,追求能效ROB需要与寄存器文件、LSQ等结构平衡设计。

2026-04-07 11:29:32 1400

原创 流水线三大冒险:结构、数据、控制

多条指令同时需要同一个硬件资源1。两条指令都要写寄存器,但寄存器堆只有一个写端口两条指令都要用除法器,但除法器只有一个取指和访存同时访问内存,但只有一个内存端口流水线冒险的本质是并行执行与程序顺序的冲突。结构冒险:硬件资源有限,需要复制或调度数据冒险:数据依赖存在,需要转发或等待控制冒险:程序流程不确定,需要预测和恢复现代CPU通过乱序执行+ROB+寄存器重命名+分支预测的组合拳,把冒险的影响降到最低。但这些机制增加了硬件复杂度和功耗,是性能与成本的永恒权衡。

2026-03-30 16:12:08 833

原创 除法流水线化:从24周期 stall 到每周期发射

阶段算法启动间隔代表早期恢复除法24-32周期MIPS FDIV中期6-12周期现代4-6周期关键认知完全流水化除法代价太高,部分流水化是甜点区SRT算法通过提升基数减少周期数Newton-Raphson利用现有乘法器,是现代主流除法单元面积和功耗敏感,需要根据场景权衡理解除法流水化,就能理解为什么现代CPU的除法性能提升比加法慢得多——这是算法复杂度和硬件成本的永恒博弈。

2026-03-20 17:59:19 401

原创 寄存器重命名:让CPU摆脱假依赖的束缚

依赖类型是否可消除消除方法实现复杂度RAW否转发/等待WAW是重命名目的寄存器中WAR是重命名目的寄存器中寄存器重命名的核心价值消除假依赖,暴露更多指令级并行支持乱序执行,提升IPC动态映射,比静态编译优化更灵活三种实现方式对比ROB-based:设计简单,但数据搬运多,功耗高ARF扩展:节省PRF空间,但取数逻辑复杂统一PRF:无数据搬运,能效最优,现代主流ARF vs PRF的关键区别ARF存储已提交状态,程序可见PRF存储推测+已提交状态,微架构内部。

2026-03-19 14:27:51 537

原创 流水线数据冒险与转发:x86和ARM的不同打法

技术解决的问题实现复杂度适用场景EX→EX转发ALU结果立即使用低所有流水线处理器MEM→EX转发Load数据使用中需要处理Load-Use延迟寄存器重命名WAW/WAR冒险高乱序执行处理器Store后Load同一地址中减少内存访问延迟数据唤醒多发射依赖管理高超标量处理器关键认知只有RAW是真实依赖,WAW/WAR可通过重命名消除转发利用结果产生早的特性,避免等待写回x86用复杂硬件(微操作、重命名)实现高性能。

2026-03-18 22:17:27 470 1

原创 SRAM与DRAM:速度 vs 容量的永恒博弈

维度SRAMDRAMHBM速度0.5-2.5ns50-100ns~10ns容量MB级GB级10-100GB成本$5000+/GB$1-3/GB$50-100/GB用途缓存主存AI/HPC加速器关键认知SRAM和DRAM的分工由物理原理决定,短期内不会改变DRAM容量增长放缓,但HBM通过3D堆叠继续提升带宽Memory Wall问题无解,只能通过缓存层次、预取、近内存计算缓解未来可能是DRAM + SCM + CXL的混合架构。

2026-03-17 21:13:49 1223

原创 10种高级缓存优化技术

缓存优化是计算机体系结构的核心课题。《计算机体系结构:量化研究方法》中总结了10种高级优化技术,每种都在性能、功耗、复杂度之间做取舍。

2026-03-16 10:34:24 700

原创 硬件预取:让CPU提前把数据准备好

预取类型适用场景效果风险Stream顺序访问高带宽浪费Stride固定步长高缓存污染软件预取不规则访问中代码复杂机器学习复杂模式高(研究中)硬件成本关键认知预取对规则访问(数组、矩阵)效果最好不规则访问(链表、树)预取效果差,甚至可能有害现代CPU有多种预取器,可以通过MSR调优软件预取作为硬件预取的补充,处理特殊场景理解预取,写高性能代码时就能知道什么时候依赖硬件,什么时候手动干预。

2026-03-15 21:59:07 772

原创 缓存分块(Cache Blocking):矩阵乘法的救命稻草

优化效果复杂度解决空间局部性低解决时间局部性中SIMD向量化提升单周期算力中多层分块利用整个缓存层次高关键认知3B2≤CL13B2≤CL1​实际B值通常取64或128(考虑SIMD对齐)多层分块(L1/L2/L3)能进一步提升性能现代编译器能自动分块,但手工调优仍有价值理解分块,就能理解为什么OpenBLAS/GotoBLAS比naive实现快10倍以上。

2026-03-13 15:51:02 387

原创 关键字优先 & 提前重启动:让CPU少等内存的两种套路

策略改变传输顺序适用场景实现复杂度实际收益否顺序访问低中等(空间局部性限制)是随机访问中高(大块缓存)关键认知块越大(≥64B),这两种技术的收益越高Early Restart单独使用效果有限,因为空间局部性导致下一次访问很可能已经传过了Critical Word First需要内存控制器支持,实现更复杂现代处理器主要依赖硬件预取和来隐藏延迟,这两种技术作为辅助理解这些,做缓存设计时就能在复杂度、功耗、性能间找到平衡。

2026-03-12 10:24:40 411

原创 Multi-Banking Cache功耗节省:为什么拆成小Bank更省电

机制原理效果细粒度激活只开需要的Bank,其他门控省30-50%动态功耗低电容负载小Bank的Bitline/Wordline短省50-70%访问能量单端口优化避免True Multi-port的高功耗省40-60%晶体管功耗ARM Cortex-A8 L2:4 Bank比单Bank省35%动态功耗Intel Core i7 L1:Bank级门控省20-25%功耗先进工艺(5nm)下,静态功耗节省更显著理解这些机制,做芯片设计时就能在功耗、性能、面积间找到平衡。

2026-03-11 13:55:37 464

原创 C++/Java/Python写合并优化实战

语言关键工具核心优化Java减少系统调用,避免JNI拷贝Python零拷贝视图,直接buffer操作C++手动buffer, mmap, writev穿透抽象,直接系统调用关键认知缓冲不是万能的,大数据批量写反而要避免二次缓冲零拷贝(memoryview/mmap)比缓冲更快,但代码更复杂系统调用次数是瓶颈,每次write都有上下文切换开销理解这些,写高性能IO代码时就能做出正确选择。

2026-03-10 21:20:00 435

原创 写缓冲区合并:把零碎写入打包成批量传输

优化效果代价写缓冲隐藏写入延迟需要缓冲区硬件写合并减少总线事务,提高带宽增加合并逻辑复杂度WC内存类型最大化合并效果弱序,需要显式fence关键要点合并需要地址连续,对齐访问很重要4条目缓冲区在现代CPU下仍可能满,导致5-10%性能损失WC内存类型适合流式写入,但不适合需要顺序保证的场景MMIO和设备寄存器必须禁用合并理解写合并,写高性能代码时就能知道什么时候用memcpy,什么时候用movnt,什么时候必须sfence。

2026-03-09 15:51:26 839

原创 多缓存组(Multi-Banking):让缓存像多车道高速一样并行

特性单Bank多Bank峰值带宽低高(随Bank数线性增长)访问延迟固定可能因冲突增加功耗效率低(每次激活整个阵列)高(只激活一个Bank)面积开销低高(控制逻辑复制)实现复杂度简单需要仲裁和冲突处理Bank数太少:并行度不够,容易冲突Bank数太多:面积功耗爆炸,收益递减L1缓存:4-8 BankL2缓存:8-16 Bank理解Bank化,写代码时就能避免Stride陷阱,做体系结构设计时也能做出合理的权衡。

2026-03-08 10:53:48 712

原创 无阻塞缓存:让CPU在等内存时也不闲着

无阻塞缓存通过MSHR结构,让CPU在等待慢速内存时也能处理其他请求。技术效果硬件代价降低20-30%有效miss penaltyMSHR条目,合并逻辑重叠多个内存延迟更多MSHR条目,内存控制器支持设计权衡高性能处理器(服务器/桌面):深MSHR,支持大量并发miss低功耗处理器(移动/嵌入式):简化或省略MSHR,节省面积功耗历史意义。

2026-03-06 11:06:17 497

原创 缓存里的“组“和“路“到底是啥关系?

概念类比作用设计影响组(Set)楼层号快速定位候选区域,限制比较范围组数多→Index位数多→Tag比较器简单,但索引电路复杂路(Way)房间号提供多个位置减少冲突缺失路数多→miss rate低→但比较电路复杂、延迟高、功耗大直接映射= 1路,最快但冲突多,适合实时系统全相联= 1组N路,无冲突但太慢,只能做小缓存组相联= 平衡方案,4-8路是现代L1的甜点区理解了这个二维结构,再看缓存优化、伪共享、缓存行填充这些高级话题就轻松多了。

2026-03-05 11:19:17 509

原创 增加流水线段数对高相联度缓存的影响

场景推荐方案理由服务器CPU(高吞吐)L1缓存访问3-4段流水线 + 8-16路频率优先,预测准确率可接受,吞吐量最大化桌面CPU(均衡)L1缓存访问2-3段流水线 + 4-8路平衡延迟和频率,兼顾游戏和生产力移动端CPU(低功耗)L1缓存访问1-2段流水线 + 4路减少动态功耗,避免预测失败惩罚实时系统(确定性)单周期L1缓存访问 + 2-4路延迟可预测,无预测失败风险GPU(高吞吐+延迟容忍)L1缓存访问4-5段流水线 + 高相联度延迟被warp调度掩盖,追求极致频率。

2026-03-04 14:52:58 474

原创 芯片的静态功耗:关不掉的“待机耗电“

静态功耗是芯片的"基础代谢",通电就有,空闲时反而更显眼。想省电,要么工艺进步降低漏电流,要么干脆断电——电源门控就是后者的工程实现。

2026-03-03 13:40:39 463

原创 集成电路里的功率与能耗

维度功率能耗定义瞬时耗电速率总耗电量关注点散热、电源设计任务成本、电池续航优化目标不超过上限尽可能降低做系统设计时,功率是约束,能耗是优化目标,两者都重要。

2026-03-02 21:03:52 424

原创 TLB命中后会发生什么?

内存访问流程中的TLB与Cache协同工作:虚拟地址先经TLB转换为物理地址,命中则快速进入Cache查询阶段;若TLB缺失需触发异常处理,显著增加延迟。关键优化包括TLB-Cache流水化、写回策略减少I/O,以及虚拟索引Cache(VIVT/VIPT)的并行查询设计。TLB作为页表的热点缓存,其命中率直接影响整体性能,缺失可能导致百周期级延迟。系统通过硬件自动管理TLB,而操作系统维护页表权威映射,二者协同完成高效地址转换与数据访问。

2026-03-01 20:18:32 637

原创 虚拟页放哪儿?怎么找?

缺页的代价很高——要从磁盘读数据,毫秒级延迟。所以操作系统有两个核心诉求:一是虚拟页可以放在物理内存的任意位置(灵活性),二是找到它的速度要快(效率)。这两个诉求其实有点矛盾。

2026-02-28 10:11:24 945

原创 为什么操作系统要用虚拟地址?

虚拟地址让操作系统有了调度的空间。进程看到的是一个干净、连续、独享的地址空间,实际的物理内存分配、换入换出、共享隔离,都由操作系统在幕后处理。这个抽象层带来了安全性、灵活性和效率,是多任务操作系统的基础。

2026-02-27 11:50:07 443

原创 那个总在“刷新”的内存,到底怎么工作的?

DRAM用电容存数据,便宜量大但需要一行一行时常刷新;靠着分层译码和Bank结构让它勉强能跟上CPU,但和SRAM比还是慢得多。DRAM刷新频率可以在BIOS中更改吗?什么是内存时序?

2026-02-26 11:56:56 380

原创 缺页中断:当程序访问的内存不在物理内存中时

程序运行时,CPU通过虚拟地址访问内存。MMU(内存管理单元)负责将虚拟地址翻译成物理地址——这个过程依赖页表。当页表告诉你"这个页面不在内存里",缺页中断就发生了。

2026-02-25 11:37:13 423

原创 Write-Through&Write-Back

直写是实时同步,保险但慢;写回是延迟批量,快但有丢数据风险。现代CPU为了性能,基本都是写回,靠硬件协议保证不出乱子。

2026-02-24 09:02:09 328

原创 stall&halt

CPU中的stall和halt虽然常被翻译为"暂停",但含义截然不同。stall是流水线局部暂停,如数据冒险或资源冲突导致的短暂卡顿,不影响其他指令执行;halt则是系统级完全停机,如程序结束或异常导致的全局停止,需外部干预才能恢复。关键区别在于:stall是流水线调度机制(短暂/局部),halt是系统状态切换(持久/全局)。电源管理的C-State属于halt相关机制,涉及整个处理器的功耗状态切换。

2026-02-23 13:57:43 631

原创 流水线寄存器的3种操作模式:正常/暂停/气泡

摘要:CPU流水线寄存器有三种工作模式:正常模式(数据正常流动)、暂停模式(保持原值等待数据就绪)和气泡模式(插入空操作清除错误指令)。暂停用于处理数据冒险,气泡用于分支预测失败。两者分别通过关闭写使能和多路选择器实现,在正确性与性能间权衡。暂停会降低CPI,气泡更浪费周期,频繁使用将削弱流水线优势。(149字)

2026-02-22 10:58:56 450

原创 MOV 指令的数据流向

摘要:汇编语言中MOV指令的两种语法格式(Intel和AT&T)操作数顺序完全相反,但数据流向一致。Intel语法采用"目标,源"格式,而AT&T语法采用"源,目标"格式。两种语法在寄存器标记、立即数表示等方面也存在差异,这是由历史原因造成的。MOV指令实质是复制而非移动操作,使用时需注意操作数大小和内存访问的语法区别。建议初学者从Intel语法入手,遇到AT&T代码时记住"顺序反过来"即可。

2026-02-21 09:03:55 319

原创 标量和矢量 AVX2 指令差异

摘要:AVX2指令集中标量(如vaddss)与矢量(如vaddps)指令的核心区别在于处理方式:标量指令每次仅处理1个数据(使用寄存器低32/64位),适合串行计算;矢量指令则能批量处理多个数据(单精度8个/双精度4个),充分利用256位寄存器实现并行计算。标量模式主要用于兼容旧代码和处理数据依赖场景,而矢量模式才是SIMD的性能关键。指令后缀"ss/sd"表示标量,"ps/pd"表示矢量。实际编程应优先使用矢量指令以发挥AVX2的最大效能。

2026-02-20 10:29:03 372

原创 跳转表为何要求 case 值范围跨度较小?

编译器在switch-case语句中选择生成跳转表或if-else取决于case值的分布情况。跳转表通过空间换时间,将case值与代码地址对应,实现O(1)复杂度跳转,适合case值密集且数量较多的情况。但当case值稀疏或跨度较大时,跳转表会浪费大量内存,导致缓存失效,此时if-else更高效。GCC会根据case的密集程度和数量自动选择最优策略,开发者应尽量保持case值连续以获得最佳性能。

2026-02-19 15:19:40 587

原创 x86-64汇编寄存器:通用寄存器+SIMD寄存器

摘要:本文系统梳理了x86-64架构的寄存器体系,分为三部分:1)通用寄存器包含经典四件套(rax/rbx等)、地址专用款(rsi/rdi等)和新增款(r8-r15),重点解析其命名规则和位数后缀;2)SIMD寄存器(XMM/YMM)用于并行计算,与通用寄存器分工明确;3)参数传递规则强调整数/指针参数优先使用RDI-R9序列,浮点参数使用XMM0-XMM7序列。文章通过典型函数案例演示寄存器分配逻辑,并指出参数传递与计算场景下寄存器使用的关键区别。

2026-02-18 15:19:16 1328

原创 敲下“hello, world“后,计算机内部发生了什么?

计算机执行"hello, world"程序的过程展现了硬件系统的协同工作:用户输入命令后,CPU将指令存入寄存器,shell通过DMA技术将程序从磁盘加载到内存,避免了CPU直接参与数据搬运。随后CPU从内存读取指令,处理后将结果写入显示器的内存映射区,最终在屏幕输出。这一看似繁琐的流程(磁盘→内存→寄存器→显示器)实则是硬件架构的必然选择:寄存器是CPU唯一的工作区,外设必须通过总线与CPU通信,这既确保了运算效率,又维护了系统安全。整个过程体现了计算机系统中各组件分工协作的精妙设计。

2026-02-17 13:15:53 362

原创 内存里的 “临时货架” vs “大仓库”:堆与栈的底层逻辑拆解

摘要: 本文对比了程序内存中的栈(Stack)和堆(Heap)两大区域。栈由系统自动管理,存放基本类型、局部变量等短期数据,速度快但空间小;堆需手动管理(或依赖GC),存放对象、动态数据等长期数据,灵活但效率较低。核心区别包括生命周期、分配方式、线程安全等。不同语言(如C++、Java)的实现各有差异,开发中需注意栈溢出、内存泄漏等问题。优化建议:高频小数据用栈,大对象用堆并及时释放。理解二者差异有助于提升代码性能和排查内存问题。

2026-02-16 15:36:03 991

原创 Pycharm运行后没有输出

但是我初始设置就是这样。发现在同级设置中,勾选 Execution-Emulate terminal in output console就可以了。以前版本可能默认勾选。新配了一台电脑,装上pycharm后运行脚本发现窗口没输出,一度以为是pycharm版本问题。Pycharm运行后没有输出。

2023-07-15 18:36:35 3078 1

原创 python的深浅复制

天天上班,好久没更新博客了,今天update公司的工具,发现一个低级但是容易忽略的问题。对,没错,就是这个面试题一直有的东西。背景是我需要复制一个字典,在循环中我每次使用=来复制。但是实际上只是浅复制来引用。所以每次都会以上个字典为模板来复制。解决方案:使用copy()同样,数组也可以用copy。

2023-05-29 20:50:51 206

原创 打包python为exe可执行程序,可在无python环境运行

有一些自动运行或者有GUI界面的代码可以直接打包成exe,这样在没有Python环境的电脑上面也可以直接运行,比较方便。

2021-12-07 15:46:40 3006

原创 LeetBook 列表/数组和字符串

LeetBook系列博客记录一下Leetcode中书籍的一些题目解法。题目均来自https://leetcode-cn.com/。    724. 寻找数组的中心下标难度:简单  给你一个整数数组 nums,请编写一个能够返回数组 “中心下标” 的方法。数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。如果数组不存在中心下标,返回 -1 。如果数组有多个中心下标,应该返回最靠近左边的那一个。注意:中

2021-06-26 13:36:58 403

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除