ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

CPU体系结构核心词汇详解:从流水线到缓存与并行架构

CPU体系结构核心词汇详解:从流水线到缓存与并行架构 先抛一个很实际的场景你在读RISC-V手册或者某篇CPU微架构论文时前几分钟不是被算法难住而是被一串英文动词卡住——fetch、decode、issue、retire、flush、forward。这些单词大学英语都学过但放在流水线的语境里每个都有一层硬件行为的精确含义。这就是计算机体系结构相关单词最特别的地方它考验的不是词汇量而是你是否能把一个词和一个硬件动作、一个时序事件联系在一起。这篇文章不打算列一份A-Z词表就完事而是按CPU流水线、存储层次、并行架构、性能度量、易混词几个主题拆着讲每个词都给中文释义、硬件行为、常见误用。适合马上要面体系结构方向的岗位、刚开始啃Computer Architecture: A Quantitative Approach的朋友也适合日常写程序但想搞懂CPU到底干了什么的工程师。先说明一下标题里的体系机构和学术界通用的体系结构指的是同一个领域英文对应computer architecture下面统一用体系结构来写。1. 为什么体系结构单词比普通词表更难学三个典型误区1.1 误区一把术语当成孤立词条背很多朋友背词表的方式是hazard冒险stall停顿bubble气泡背完第二天全忘。问题不在记忆力而是这些词根本不能孤立存在。以hazard为例它背后是流水线的一条完整因果链两条指令在某个阶段需要同一资源、或者前一条指令的数据还没算出来、或者分支目标还没确定这时候流水线为了保证正确性只能暂停插入气泡这个过程叫stall为了少暂停硬件可以做的旁路转发叫forwarding分支走错时还要清空错误路径上的指令叫flush。你只背hazard一个词等于只拿了链条上的一环自然记不住。我实际的经验是把术语放回读文档的最小场景里去记。比如看到a branch misprediction flushes the pipeline and refetches from the correct target你脑子里要有画面取指阶段本来沿着预测方向拿了好几条指令后来发现预测错了这些指令全部作废流水线从头再来。这样一个句子能同时帮你记住misprediction、flush、refetch、correct target四个词而且比背四遍单词表牢得多。1.2 误区二中英文对上了可还是不知道硬件做了什么最容易暴露这个问题的词是issue和retire。按普通英语理解issue是发布retire是退休放在句子里面完全翻译不通。在体系结构语境里issue指发射阶段流水线把一条已经完成译码、寄存器重命名、解决资源冲突的指令送进执行单元这个动作才是issue。而retire同commit表示指令最终按程序顺序提交结果到寄存器堆或内存从流水线离开。一个词对应一个硬件单元里的动作你才能看懂four instructions are issued per cycle but only one can retire per cycle这种性能相关的话。记这类词的建议是不要先翻译成中文先问这个动作发生在流水线的哪个阶段、哪个硬件结构里。fetch永远对应取指部件decode对应译码器rename对应寄存器重命名表retire对应重排序缓冲ROB的尾部。把单词和硬件单位绑定比背任何译文都牢靠。这也是为什么很多人背了词书还是读不懂论文——词书给的是词典义论文里用的是机制义。1.3 误区三不分层级把所有结构混在一起讨论architecture这个词最容易造成混乱。有人看到x86是architecture、某颗CPU的微架构也是architecture觉得两者是一回事。其实体系结构领域习惯分三层ISAInstruction Set Architecture是程序员的契约比如x86-64、RISC-V决定软件能用哪些指令和寄存器microarchitecture是具体CPU怎么实现这份契约比如超标量、乱序执行、缓存多大system architecture则是CPU、内存、IO设备怎么组织成一个完整系统。这个层级一乱很多词你都对不上。比如word size在ISA层指架构定义的字长在微架构层可能指数据通路宽度两者可以不同。读A-Z词表时觉得每个词都见过读整篇文档时发现彼此打架往往就是这个原因。先建立一个三层框架再往里面填单词整个体系结构词汇就能挂起来了。2. 处理器与流水线相关单词CPU每一步在干什么的动词2.1 一条指令的一生Fetch、Decode、Execute、Memory、Write Back流水线这个词pipeline本身就是从工厂装配线借来的概念所以描述一条指令生命周期用的几乎全是动词。指令从PCProgram Counter程序计数器有些文档叫IP指令指针给出的地址取出来这个过程叫fetch。取回来之后译码器decode解出操作码、寄存器号、立即数。接下来execute是真正执行运算的地方ALU在里面干活。如果需要读内存还有memory access阶段。最后把结果写回寄存器堆或内存这个动作在经典流水线里叫write back在乱序执行里更常叫retire或commit。为什么一定要记这一串因为后面的很多术语都挂在这条链上出了hazard要stall分支预测错了要flush指令不按顺序完成但按顺序retire这些都是在描述流水线阶段之间的相互作用。你把一条指令的生命周期当作锚点再去看任何关于流水线的长难句主干就清晰了。另外注意一个细节PC在很多RISC手册里写作pc并且规定保存的是下一条指令地址分支、跳转、异常处理都会改它。这也是理解control hazard的起点。2.2 Hazard、Stall、Forwarding流水线冲突三兄弟流水线单词里hazard、stall、forwarding几乎总是连着出现。hazard分三类structural hazard结构冲突两个阶段要用同一个硬件单元比如只有一个存储器取指和访存撞在一起data hazard数据冲突后一条指令要用前一条指令的结果前一条还没算完最典型的就是lw后面紧跟一条add使用lw加载的值也叫load-use hazardcontrol hazard控制冲突分支还没算出是否跳转取指单元不知道下一步该取哪条指令。硬件处理这些冲突的主要手段就是stall暂停也叫插入bubble气泡相当于流水线上塞一个空档保证正确性但损失性能。为了少插入气泡CPU还会做forwarding旁路转发把前一条指令算出的结果直接通过内部连线送给后一条指令的输入端绕过先写寄存器再读寄存器的老路。这套词几乎是面试必考。我建议在脑子里过一遍load-use场景load指令要等到访存阶段结束数据才可用即便有forwarding也堵不上这个特定的洞所以必须stall一拍。能用三句话把为什么forwarding有时候救不了load-use讲清楚说明你真的理解了data hazard而不是背了一堆名字。2.3 Superscalar、Speculative、Out-of-Order现代CPU的三个关键词理解单条指令的流水线之后还要记住三个体现现代CPU更贪心的词。superscalar指超标量每个时钟周期可以同时发射多条指令所以有fetch 4decode 4dispatch 4这类说法具体数字取决于微架构设计。speculative指推测执行遇到分支时不等结果出来先沿着预测方向继续执行等分支真正算出来如果错了就flush掉沿途指令。out-of-order指乱序执行后面能先执行的指令不必等前面卡住的指令它们被送到保留站reservation station里等待操作数结果算完先放在ROB里最后再按程序顺序retire保证外部行为还是有序的。注意IPC在体系结构里是instructions per cycle每周期完成的指令数不是每秒指令数后者通常是IPS或MIPS。面试时把IPC解释成每秒指令数会被立刻纠正这一条值得刻意记住。这里的IPC常和superscalar宽度、乱序能力一起讨论。现代CPU宣传页上写IPC提升15%本质是在说相同主频下每个周期能多完成约15%的指令这比简单看主频数字更能反映微架构进步。3. 存储层次结构单词Cache、TLB、页表背后的逻辑3.1 为什么一切从Cache Line / Block开始存储层次的词汇里cache line缓存行和cache block缓存块基本同义一般说的64字节就是它。它是CPU缓存和主存之间传输的最小单位不是按单个字节对齐而是整行搬运。读一个字节时如果缓存miss硬件会把包含它的整条cache line从内存读进来写一个字节时如果整行不在缓存里通常也要先把行取进来这叫write allocate写分配。理解line之后几个地址拆分的词就好办了tag标签用来判断这一行存的是不是我们要找的地址范围、set index组索引决定去哪个组里找、block offset块内偏移决定数据在行内哪个字节。做CPU设计题时几乎都会碰到地址怎么拆成tag/index/offset的运算这不是死记公式而是缓存索引机制的直接体现。还有valid bit有效位表示这一行有没有被填充过write-back缓存里还有dirty bit脏位表示这行跟内存是否不一致。3.2 Write-through和Write-back两种写策略的性格差异缓存命中之后的写处理主要就两个词。write-through写直达是数据同时写入当前层缓存和下一级内存优点是简单、内存永远与缓存一致缺点是每次写都要往底层跑一趟浪费带宽。write-back写回是先只写缓存把这一行标记为dirty等这行被替换出缓存时才把整个脏行写回内存。优点是写操作变快缺点是缓存和内存不一致别人跨核观察数据时要考虑一致性协议。从单词角度write-back的关键配套词就是dirty bit。在低功耗场景里设计者还会特别关注dirty行替换时的写回收成本所以有些资料会提clean与dirty cache line。面试里一个常见问题一个write-back缓存某行被反复写但不被替换那么内存里一直是旧值对不对对这正是设计意图。理解了延迟写回这个行为整个write-back的好处和风险都串起来了。3.3 虚地址、页表、TLB翻译而不是直接存虚拟内存这一块核心单词是page页虚拟地址空间的分块单位、page frame页框物理内存中对应的块、page table页表记录虚拟页到物理页框的映射、PTEPage Table Entry页表项里面还有权限位、脏位、访问位。CPU访存时拿到的是虚拟地址必须先把虚拟页翻译成物理页框再拼上页内偏移得到物理地址这个过程叫address translation。为了不让每次访存都去内存翻页表CPU里放了一个专门的缓存叫TLBTranslation Lookaside Buffer有的中文书叫快表。它的行为和一个cache很像有tag、有valid位、也有hit和miss。一旦TLB miss硬件就要去走多级页表这个动作叫page table walk如果页表项不在内存里才是page fault缺页异常交给操作系统处理。很多初学者把TLB当成一个独立神秘的东西其实一句话就能说清TLB是页表项的cache。这句话比背任何缩写都管用。3.4 Coherence和Consistency两个最容易被混用的词多核缓存相关最值得分辨的两个词是cache coherence缓存一致性和memory consistency内存一致性模型。coherence关心的是对同一内存地址的多个缓存副本CPU0改了地址A里的值CPU1的缓存里还有旧副本必须通过协议比如MESI协议和总线或互连交互让旧副本失效或更新保证所有核看到的同一地址的值是一致的。consistency关心的是不同地址之间访问的可见顺序比如CPU0先写data后写flagCPU1读flag再读data多核下能不能保证先看到data的新值这由内存模型决定。x86属于较强的TSO模型很多程序员直觉里的先写后写应该按顺序可见大体成立ARM和RISC-V则是weak memory model需要程序员显式用fence或屏障指令约定顺序。我建议不要说一致性协议解决了所有问题因为它只解决coherence那一层跨地址的顺序问题要靠consistency模型和各平台的原子指令、屏障指令来处理。能把这两个词区分开多核编程文档基本就不会误读了。4. 并行与异构架构单词Socket、Core、Thread、SIMD、Warp4.1 Socket、Core、Thread、SMT先分清楚再谈并行并行体系结构里的词先用层级关系理清socket指物理CPU插槽一台服务器可能有2路、4路即多个物理CPU每个CPU内部有多个core物理核每个核如果支持SMTSimultaneous Multithreading同步多线程Intel叫Hyper-Threading就可以同时执行多个thread这里指硬件线程。所以8核16线程的意思是一个物理核被复制了两份架构状态可以同时发起两个指令流但执行单元仍是共享的不是凭空多了两个CPU。这里的坑是thread这个词在不同语境下含义完全不同操作系统里的thread是软件调度单位CPU设计里的hardware thread是执行上下文。多路服务器还会遇到NUMANon-Uniform Memory Access非一致内存访问访问本地内存比访问对端CPU的内存快性能优化时就要考虑线程绑核、数据就近放置。如果面试官问为什么16核不等于16倍性能除了下面要讲的Amdahl定律SMT共享执行单元和NUMA访存差异也都是直接相关的答案素材。4.2 Flynn分类法SISD、SIMD、MIMD还有几乎不存在的MISD描述并行机器最经典的是Flynn分类法四个词SISDsingle instruction single data单指令单数据传统单核最简单形态、SIMDsingle instruction multiple data单指令多数据一条指令同时处理一批数据、MISDmultiple instruction single data学术界罕见某些容错或锁步场景才会讨论、MIMDmultiple instruction multiple data多核多线程主流形态。这个分类看的是指令流和数据流到底有几条而不是核心数量。SIMD这个词在今天的价值尤其大。CPU里的向量指令集x86的SSE/AVX、ARM的NEON/SVE就是SIMD的体现一条add指令对向量寄存器里多个元素同时相加。GPU更是把SIMD做到了极致但GPU的调度单位习惯叫warp或wavefront一个warp是32个线程NVIDIA以锁步方式执行同一条指令NVIDIA官方更愿意称这种模型为SIMTSingle Instruction, Multiple Threads本质是SIMD的线程化变种。区分SISD、SIMD、MIMD不需要背定义举三个硬件例子就够了旧的单核CPU、跑AVX的现代CPU、多核服务器CPU。4.3 异构计算词汇Host、Device、Kernel、Warp、Occupancy做GPU或加速器相关工作时还有一批词来自异构编程生态。host是控制端通常是CPUdevice是加速端GPU或加速卡。写出来在GPU上并行执行的函数叫kernel内核函数调用kernel时不是执行一次而是启动一堆线程线程组织上有thread、warp、thread block、grid几个层级层级的主要作用是管理调度和共享内存。warp这个词前面提到了它是NVIDIA实际调度的最小执行单位一个warp包含32个线程按单指令多线程方式一起推进。如果一个块里有128个线程硬件会把它拆成4个warp来调度。另一个常遇到的词是occupancy占用率指活跃warp数与最大可容纳warp数的比例它会影响latency hiding隐藏延迟的能力warp越多访存等待时越能切换别的warp继续算。还有memory coalescing合并访存同一个warp的线程访问连续地址时会被合并成少数几个内存事务这是GPU性能优化的核心概念之一。这套词的记忆方法很简单遇到陌生术语就问一句它是哪个硬件单元的调度或资源行为只要绑到硬件实体上一般不会记混。5. 性能度量相关单词Latency、Throughput、CPI 与 Amdahl定律5.1 Latency与Throughput一个是单个一个是总量性能度量的两个基础词必须分清楚。latency延迟是单个请求从发出到完成所花的时间单位比如100ns、200cyclesthroughput吞吐量是单位时间内系统完成的任务数比如每秒处理多少请求。很多体系结构优化做的其实是把两者分开考虑流水线、多发射能让throughput显著上升但单条指令落地完成的时间并不会因此同步缩短所以为什么流水线提升了吞吐但没有降低单条指令的延迟是经典面试题。中间还常混着一个词bandwidth带宽它描述链路或存储系统单位时间最多能传多少数据是理论最大吞吐。比如内存带宽是DDR5的多少GB/s而实际throughput可能受latency、并发度、访问模式影响。做性能优化时我习惯先问一句当前是latency敏感还是throughput敏感B树点查是latency敏感数据扫描是throughput敏感。连这个问题的方向都不对下面再分析cache miss也是白搭。英文术语含义典型用途Latency单个操作从发起到完成的时间指针访问、点查Throughput单位时间完成的操作数带宽密集型扫描、网络转发Bandwidth链路/存储器单位时间最大传输量内存总线、IO链路选型这张表特别适合写在性能优化笔记的第一页因为几乎所有性能讨论最终都会落到你在优化延迟还是吞吐这个问题上。5.2 CPI、IPC、Speedup与Amdahl定律用数字把性能说清楚体系结构性能的实际语言是CPICycles Per Instruction每指令周期数和IPCInstructions Per Cycle每周期指令数两者互为倒数。理想CPU可能达到CPI1甚至更低但真实程序里cache miss、分支预测失败、资源冲突都会让CPI往上走所以CPI是评估微架构收益最常用的数字指标之一。看benchmark时如果报告里写CPI increased from 1.1 to 1.4第一反应应该是找结构性原因而不是简单说慢了。并行加速比的核心词是speedup加速比和Amdahls Law阿姆达尔定律。加速比是旧执行时间除以新执行时间Amdahl定律说如果程序可并行部分占比F使用P个处理器时理论上限是1/((1-F)F/P)。举个具体数字F90%P16算下来1/(0.10.9/16)1/0.156256.4倍如果把P推到无穷大极限也只有10倍因为那10%串行部分永远挡在路上。这个定律是16核不等于16倍的最根本解释也是所有并行系统设计绕不开的思考框架。5.3 描述瓶颈和开销Bottleneck、Overhead、Hot Spot此外还有几个不是定义题但英文文档里高频出现而且工程交流很好用的词。bottleneck瓶颈指限制整体性能的那个环节比如内存带宽、锁竞争overhead开销指为了正确性或管理而付出的额外代价比如同步开销、上下文切换开销hot spot热点指被频繁访问或集中执行的代码或数据区性能分析工具里也常看到这个词占比较高。还有一个动作词profile指用性能剖析工具测出各部分的耗时占比比如perf profile、cpu profile。这套词属于工程交流语言。写优化说明时说we found that the memory stall was the bottleneck and reduced the cold miss overhead比内存慢导致程序慢要专业得多。建立在准确术语之上的结论别人才能放心地复现和讨论。6. 易混术语一对一对拆Architecture、Endian、Word 与更有效的记忆法6.1 Architecture、ISA、Microarchitecture契约与实现的区分第一个要拆的是architecture和microarchitecture。很多人把architecture当成体系结构的总称microarchitecture当成微架构但两者经常被混在一个句子里。其实可以这样记ISAInstruction Set Architecture是硬件给软件立下的契约规定能执行哪些指令、有哪些可见寄存器、异常怎么处理microarchitecture微架构是CPU内部怎么实现这份契约比如流水线几级、是否乱序、缓存多大。同一个x86下这两者不是宏观和微观的关系而是规格与实现方案的关系。同样一个词要留意architecture单独出现时的含义。在computer architecture这个大领域里它泛指体系结构整个学科在芯片手册中this architecture supports...往往指ISA在整机方案里system architecture则指系统组成。我读文档时的习惯是先判断这句话是在谈软件兼容层、内部实现层还是整机组织层再决定architecture具体指谁。这个判断训练多了A-Z词表上那些一词多义问题基本就都不是事了。6.2 Endian、Byte、Word、Page、Frame最容易搞错的几个单位Endianness字节序决定多字节数据在内存里怎么排。little-endian把最低有效字节放在低地址big-endian正好相反。x86和绝大多数现代服务器CPU是little-endian网络协议习惯用big-endian所以叫network byte order。如果你在调试二进制协议或者在看ELF文件头、内存dump这个单词决定你看到的字节顺序是否合理。Word字是个历史上很灵活的单位。x86语境里word最早是16位之后就有了doubleword32位、quadword64位这些名字但其实今天的64位数据通常叫64-bit而不是quadwordRISC-V的资料里word在不同配置下可能指32位。所以在不同架构文档里看到word时必须靠架构定义而不是直觉。Page和frame前面说过page是虚拟地址空间的单位frame是物理内存的单位页表项负责把page翻译成frame。这四个词都属于单位和地址类术语建议专门建一张自己的对照表而不是分散在词表里背。6.3 把单词变成自己的语言最小场景句记忆法最后分享一个我用了很久的笨办法给每个术语写一个最小场景句不写长篇释义。比如IPC的最小场景句就是this core retires up to four instructions per cycle, so the peak IPC is fourcache line的就是a miss fetches the whole 64-byte line, not just the byte you needhazard的是the load-use hazard forces a one-cycle stall even with forwarding。这些句子每个都只有一行但包含了一个完整的机制场景比单独背中文翻译更能建立条件反射。我建议每篇文章都用真实材料喂拿一本RISC-V规范或一份CPU微架构文档把不认识的术语按上面的分类归档每个术语附上原句、中文解释、硬件行为。坚持一段时间后你会发现真正难的不是见过多少词而是看到一个词能不能立刻在硬件里定位到那个动作。这个定位能力才是这些单词学习里最值钱的部分。
返回列表