<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>补充专题 on Dorkytiger 的小屋</title>
    <link>https://www.dorkytiger.top/c-plus-plus/c-plus-plus-concurrent-programming/06-supplement/</link>
    <description>Recent content in 补充专题 on Dorkytiger 的小屋</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <atom:link href="https://www.dorkytiger.top/c-plus-plus/c-plus-plus-concurrent-programming/06-supplement/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>内存分配器</title>
      <link>https://www.dorkytiger.top/c-plus-plus/c-plus-plus-concurrent-programming/06-supplement/01-memory-allocator/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.dorkytiger.top/c-plus-plus/c-plus-plus-concurrent-programming/06-supplement/01-memory-allocator/</guid>
      <description>&lt;p&gt;好的，我们从第一个盲区开始补齐：&lt;strong&gt;内存分配器（Memory Allocator）&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;这是无锁编程中最容易被忽视的&amp;quot;隐藏杀手&amp;quot;。你精心设计了一个无锁队列，所有 CAS 操作都完美，结果发现性能还是上不去——&lt;strong&gt;很可能是 &lt;code&gt;new&lt;/code&gt; 和 &lt;code&gt;delete&lt;/code&gt; 在背后拖了后腿&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;1-问题malloc-是个全局锁&#34;&gt;1. 问题：&lt;code&gt;malloc&lt;/code&gt; 是个&amp;quot;全局锁&amp;quot;&lt;/h3&gt;
&lt;p&gt;当我们调用 &lt;code&gt;new&lt;/code&gt; / &lt;code&gt;delete&lt;/code&gt;（底层是 &lt;code&gt;malloc&lt;/code&gt; / &lt;code&gt;free&lt;/code&gt;）时，背后是一个&lt;strong&gt;全局堆管理器&lt;/strong&gt;在干活。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[线程A] new 对象 → 进入 malloc()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    │
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    ▼
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              [全局堆锁] ← 线程A 拿到锁，开始分配内存
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    │
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[线程B] new 对象 → 进入 malloc() → 等待全局堆锁 → 阻塞！
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[线程C] new 对象 → 进入 malloc() → 等待全局堆锁 → 阻塞！
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;硬件视角&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;全局堆锁本质上是&lt;strong&gt;一个 Mutex&lt;/strong&gt;（或自旋锁），多个线程争抢时会产生&lt;strong&gt;缓存行乒乓&lt;/strong&gt;（MESI RFO）。&lt;/li&gt;
&lt;li&gt;每次 &lt;code&gt;malloc&lt;/code&gt;/&lt;code&gt;free&lt;/code&gt; 都可能触发系统调用（&lt;code&gt;brk&lt;/code&gt; / &lt;code&gt;mmap&lt;/code&gt;），陷入内核态。&lt;/li&gt;
&lt;li&gt;频繁分配/释放时，锁开销可能超过业务逻辑本身。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;结论&lt;/strong&gt;：无锁数据结构本身很快，但 &lt;code&gt;malloc&lt;/code&gt; 的全局锁会让你的多线程程序&lt;strong&gt;退化成串行执行&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;2-解决方案per-cpu--per-thread-内存池&#34;&gt;2. 解决方案：Per-CPU / Per-Thread 内存池&lt;/h3&gt;
&lt;p&gt;核心思想：&lt;strong&gt;让每个线程/核心拥有自己独立的内存池，分配时无需加锁。&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>NUMA（非统一内存访问）</title>
      <link>https://www.dorkytiger.top/c-plus-plus/c-plus-plus-concurrent-programming/06-supplement/02-numa/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.dorkytiger.top/c-plus-plus/c-plus-plus-concurrent-programming/06-supplement/02-numa/</guid>
      <description>&lt;p&gt;这是多插槽服务器（如双路 Xeon、AMD EPYC、ARM 服务器）上&lt;strong&gt;最容易被忽视的性能杀手&lt;/strong&gt;。你在单颗桌面 CPU 上跑得飞快的程序，搬到多插槽服务器上可能性能直接腰斩——&lt;strong&gt;十有八九是 NUMA 在作祟&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;1-什么是-numa物理拓扑视角&#34;&gt;1. 什么是 NUMA？（物理拓扑视角）&lt;/h3&gt;
&lt;p&gt;在传统的 &lt;strong&gt;UMA（Uniform Memory Access，统一内存访问）&lt;/strong&gt; 架构中，所有 CPU 核心通过同一条总线（或同一个内存控制器）访问所有物理内存，延迟一致。&lt;/p&gt;
&lt;p&gt;在 &lt;strong&gt;NUMA&lt;/strong&gt; 架构中，每个 CPU 插槽（Socket）拥有&lt;strong&gt;自己独立的内存控制器&lt;/strong&gt;和&lt;strong&gt;本地内存&lt;/strong&gt;。CPU 插槽之间通过高速互联（如 Intel UPI、AMD Infinity Fabric）连接。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;+-----------------------------------------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|                    NUMA 双插槽服务器                        |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;+-----------------------------------------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|  Socket 0 (CPU 0)          |  Socket 1 (CPU 1)            |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|  +-------------------+     |  +-------------------+        |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|  | 核心 0-7          |     |  | 核心 8-15         |        |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|  | L1/L2/L3 缓存     |     |  | L1/L2/L3 缓存     |        |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|  +-------------------+     |  +-------------------+        |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|  | 内存控制器 (MC0)  |     |  | 内存控制器 (MC1)  |        |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|  +--------+----------+     |  +--------+----------+        |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|           |                |           |                   |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|  +--------v----------+     |  +--------v----------+        |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|  | 本地内存 (Node 0) |     |  | 本地内存 (Node 1) |        |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|  | 延迟: ~80ns       |     |  | 延迟: ~80ns       |        |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|  +-------------------+     |  +-------------------+        |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|           |                |           |                   |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|           +----[UPI 互联]---+-----------+                   |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|               跨插槽访问延迟: ~160ns (2倍!)                  |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;+-----------------------------------------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;核心事实&lt;/strong&gt;：&lt;/p&gt;</description>
    </item>
    <item>
      <title>无锁编程的 ABA 问题实战解法</title>
      <link>https://www.dorkytiger.top/c-plus-plus/c-plus-plus-concurrent-programming/06-supplement/03-aba-solutions/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.dorkytiger.top/c-plus-plus/c-plus-plus-concurrent-programming/06-supplement/03-aba-solutions/</guid>
      <description>&lt;p&gt;这是无锁编程中最隐蔽、最难调试的陷阱——比内存分配器更&amp;quot;邪门&amp;quot;，因为&lt;strong&gt;它在单线程下完全不存在，只有在多线程高并发下才会随机触发，导致数据损坏或程序崩溃&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;1-aba-问题的本质硬件视角回顾&#34;&gt;1. ABA 问题的本质（硬件视角回顾）&lt;/h3&gt;
&lt;p&gt;我们之前讲过 ABA 问题的硬件根源，现在从&lt;strong&gt;实战角度&lt;/strong&gt;重新审视：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 场景：无锁栈的 pop 操作（有 ABA 漏洞）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;std&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;atomic&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;Node&lt;span style=&#34;color:#f92672&#34;&gt;*&amp;gt;&lt;/span&gt; head{&lt;span style=&#34;color:#66d9ef&#34;&gt;nullptr&lt;/span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;bool&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;pop&lt;/span&gt;(Node&lt;span style=&#34;color:#f92672&#34;&gt;*&amp;amp;&lt;/span&gt; result) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Node&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; old_head &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; head.load(std&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;memory_order_acquire);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Node&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; new_head;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#f92672&#34;&gt;!&lt;/span&gt;old_head) &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; false;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        new_head &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; old_head&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;next;  &lt;span style=&#34;color:#75715e&#34;&gt;// ← 读取 old_head 的 next
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    } &lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt; (&lt;span style=&#34;color:#f92672&#34;&gt;!&lt;/span&gt;head.compare_exchange_weak(old_head, new_head,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              std&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;memory_order_release, std&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;memory_order_relaxed));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    result &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; old_head;  &lt;span style=&#34;color:#75715e&#34;&gt;// ← 此时 old_head 可能已经被其他线程释放！
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; true;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;ABA 攻击时序&lt;/strong&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[时刻 T1] 线程A 读取 head = 节点X (地址 0x1000)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[时刻 T2] 线程B 弹出节点X → head = 节点Y
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[时刻 T3] 线程B 释放节点X（delete / free）
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[时刻 T4] 线程B 分配新节点Z，恰好复用地址 0x1000
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[时刻 T5] 线程B push 节点Z → head = 0x1000
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[时刻 T6] 线程A 执行 CAS：当前 head (0x1000) == 期望值 (0x1000) → ✅ 成功！
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          new_head = old_head-&amp;gt;next = 0x1000-&amp;gt;next (此时是节点Z的next)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          head = new_head（可能是垃圾地址）
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;结果&lt;/strong&gt;：head 指向了完全无关的地址，数据结构被破坏。&lt;/p&gt;</description>
    </item>
    <item>
      <title>CPU 指令级优化（SIMD / 预取）</title>
      <link>https://www.dorkytiger.top/c-plus-plus/c-plus-plus-concurrent-programming/06-supplement/04-simd-prefetch/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.dorkytiger.top/c-plus-plus/c-plus-plus-concurrent-programming/06-supplement/04-simd-prefetch/</guid>
      <description>&lt;p&gt;这是从**&amp;ldquo;算法对&amp;rdquo;&lt;strong&gt;到&lt;/strong&gt;&amp;ldquo;代码跑得快&amp;rdquo;&lt;strong&gt;的最后一公里。你之前学的都是&lt;/strong&gt;宏观架构**（缓存、内存、调度），而 SIMD 和预取是&lt;strong&gt;微观指令级&lt;/strong&gt;的优化——让 CPU 的&lt;strong&gt;每个流水线周期&lt;/strong&gt;都塞满有用的工作。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;1-simd单指令多数据流一条指令干一堆活&#34;&gt;1. SIMD（单指令多数据流）：一条指令干一堆活&lt;/h3&gt;
&lt;h4 id=&#34;什么是-simd&#34;&gt;什么是 SIMD？&lt;/h4&gt;
&lt;p&gt;SIMD（Single Instruction, Multiple Data）是 CPU 的&lt;strong&gt;并行处理扩展&lt;/strong&gt;，允许&lt;strong&gt;一条指令同时对多个数据执行相同的操作&lt;/strong&gt;。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;标量（Scalar）：一条指令处理一个数据
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;+--------+     +--------+
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;| ADD R1 | --&amp;gt; |  A + B  |  (1 次操作)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;+--------+     +--------+
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;SIMD（向量化）：一条指令处理 N 个数据
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;+--------+     +--------+--------+--------+--------+
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;| ADD ZMM | --&amp;gt; | A1+B1  | A2+B2  | A3+B3  | A4+B4  |  (4 次操作，1 条指令)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;+--------+     +--------+--------+--------+--------+
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;硬件实现x86--arm-的-simd-单元&#34;&gt;硬件实现（x86 / ARM 的 SIMD 单元）&lt;/h4&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;架构&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;指令集&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;寄存器宽度&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;同时处理数据量（单精度浮点）&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;x86 (Intel/AMD)&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;SSE&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;128-bit&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;4 个 float&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;x86 (Intel/AMD)&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;AVX2&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;256-bit&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;8 个 float&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;x86 (Intel/AMD)&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;AVX-512&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;512-bit&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;16 个 float&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;ARM (手机/服务器)&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;NEON&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;128-bit&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;4 个 float&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;ARM (服务器)&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;SVE2&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;可变（最高 2048-bit）&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;可变&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;硬件结构&lt;/strong&gt;：&lt;/p&gt;</description>
    </item>
    <item>
      <title>性能测量方法论</title>
      <link>https://www.dorkytiger.top/c-plus-plus/c-plus-plus-concurrent-programming/06-supplement/05-performance-measurement/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.dorkytiger.top/c-plus-plus/c-plus-plus-concurrent-programming/06-supplement/05-performance-measurement/</guid>
      <description>&lt;p&gt;这是把前面所有理论&lt;strong&gt;落地到实践&lt;/strong&gt;的工具箱。没有测量，你的一切优化都是&lt;strong&gt;盲人摸象&lt;/strong&gt;——你以为快了，实际上可能更慢了；你以为瓶颈在 A，实际上在 B。&lt;/p&gt;
&lt;p&gt;我们不讲空话，直接上**硬件性能计数器（PMC）&lt;strong&gt;和&lt;/strong&gt;火焰图（Flamegraph）**这两把“屠龙刀”。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;1-性能测量的核心工具硬件性能计数器pmc&#34;&gt;1. 性能测量的核心工具：硬件性能计数器（PMC）&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;PMC（Performance Monitoring Counters）&lt;/strong&gt; 是 CPU 内部的&lt;strong&gt;硬件计数器&lt;/strong&gt;，可以精确记录各种微架构事件，如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cache Miss&lt;/strong&gt;（L1/L2/L3 未命中次数）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TLB Miss&lt;/strong&gt;（地址翻译未命中次数）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;分支预测失败（Branch Misprediction）&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CPU 周期数（Cycles）&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;指令执行数（Instructions）&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;内存带宽（Memory Bandwidth）&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这些计数器是&lt;strong&gt;纯硬件&lt;/strong&gt;的，不依赖操作系统采样，&lt;strong&gt;几乎没有性能开销&lt;/strong&gt;（&amp;lt;1%）。&lt;/p&gt;
&lt;h4 id=&#34;硬件实现&#34;&gt;硬件实现&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[CPU 核心]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    │
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ├── 执行单元（ALU）
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    │   └── 计数器：指令执行数、周期数
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    │
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ├── 缓存系统（L1/L2/L3）
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    │   └── 计数器：Cache Miss、Cache Hit、缓存行传输
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    │
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ├── MMU / TLB
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    │   └── 计数器：TLB Miss
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    │
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    └── 分支预测器
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        └── 计数器：分支预测成功/失败
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id=&#34;2-linux-perf最强大的硬件性能分析工具&#34;&gt;2. Linux &lt;code&gt;perf&lt;/code&gt;：最强大的硬件性能分析工具&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;perf&lt;/code&gt; 是 Linux 内核自带的性能分析工具，封装了 CPU 的 PMC，可以精确测量程序的硬件行为。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
