前言
Intel Core 微架構(Core 2 為代表)在快取層級、資料對齊、指令流水線、解碼單元、亂序執行等方面引入重大創新。本文系統整理其核心微架構特性,並提供程式碼層面的優化指導。
一、 Core 2 快取架構
- L1 Cache:每核心獨立 32KB L1i(指令)+ 32KB L1d(資料),8-way 關聯、Write-back、64B Cache Line。
- L2 Cache:雙核心共享,16-way 關聯、64B Line、256-bit 與 L1 頻寬。
- 核心間傳輸:L1d 可直接跨核心傳輸資料。
- 預取器:L1 具多個資料/指令硬體預取器;L2 預取器依據 L1 存取模式動態工作。
- 頻寬分配:改良 Round-Robin 演算法動態平衡雙核心頻寬;前端總線同策略。
- 獨立存取設計:Core 可直接從 L2/L1/主記憶體取數,無須逐級上升。
- Inclusive 政策:L2 包含 L1 所有資料(AMD 採 Exclusive)。
二、 資料與指令位址對齊的關鍵性
現代微處理器載入/儲存記憶體時:
- 位址為 N 整數倍(N=2^M) → 單週期完成 N 位元組操作。
- 位址未對齊 → 2+ 週期,跨 Cache Line 更嚴重。
- 自然長度對齊可最小化跨 Cache Line 機率。
對齊實作方式
- 全域/靜態變數:
__declspec(align(N)) 或 __m128 等內建型別。
typedef __declspec(align(16)) int A16INT; A16INT i; // 16-byte aligned
- 堆疊變數:同樣用
__declspec(align(N)),但 MSVC 預設堆疊 4-byte 對齊,/O2 優化下常為自然對齊,建議顯式標註。
- 動態分配:
_aligned_malloc、_mm_malloc。malloc ≥8 字節為 8-byte 對齊,否則最小 2 的冪次對齊。
三、 Pentium Pro/II/III 流水線深度剖析
取指單元
- 從 16-byte 對齊位址取 16B 到 32B 緩衝,支援跨邊界指令解碼。
- IFETCH 區塊最多 16B,優先從指令邊界開始;跳轉導致 32B 緩衝重填充延遲。
- 指令長度解碼器(IFU2)每週期解析 3 條指令長度,決定下一 IFETCH 邊界。
解碼單元
- 3 解碼器並行:D0(最強,可解碼 4 uops 指令)、D1/D2(各 1 uops,≤8 bytes)。
- IFETCH 首指令固定派發 D0;後續指令若 D1/D2 無法處理則等待 D0。
- 最佳組合:1 條 2-4 uops + 2 條 1 uops = 3 uops/週期,填滿解碼頻寬。
- IFETCH 邊界導致指令分組破碎(如 4-1-1 模式在邊界被切為 1-4-1),平均吞吐下降。
指令前綴影響
- 操作數/位址長度前綴改變指令長度 → 解碼延遲。
- 段前綴無損失;重複/LOCK 前綴無延遲;多前綴疊加每個 +1 週期。
暫存器重命名 (RAT)
- 每週期處理 3 uops,大量隱藏暫存器支援無限制重命名。
- 同步計算相對跳轉位址回饋 BTB。
ROB Read 階段瓶頸
- PRF 唯有 2 讀埠,但每週期 3 uops × 2 輸入 = 6 讀取需求 → 3 週期完成 → 易阻塞解碼器。
- 若暫存器值來自未退休 ROB Entry(前 3 個 triplet 內寫入),ROB Read 無延遲(轉發機制)。
亂序執行
- ROB 容量 40 uops + 40 暫存器;RS 容量 20 uops。
- 記憶體寫入不可亂序(參考投機執行)。
四、 Pentium M / Core / Core Solo 架構演進
- 流水線比 P6 長 3-4 級(分支預測 +1、取指 +1-2、堆疊引擎、uop 融合)。
- 跳轉 16-byte 邊界無延遲 → 取指單元更複雜。
- 堆疊引擎在 D1/D2 後產生同步 uop,零額外週期。
- 微碼融合:讀-修改、寫操作 2 uops 融合為 1,降低內部頻寬壓力。
五、 Core 2 強悍登場:4-wide 解碼與循環緩衝
預解碼器
- 頻寬:16 bytes 或 6 條指令/週期(取較小者)。
- 未完成 16B 處理前不取新 16B → 7 條指令佔 2 週期,瓶頸明顯。
64-byte 循環程式碼緩衝 (L0 Cache)
- 解碼器佇列可作 64B 循環緩衝(4×16B 行)。
- 熱循環完全置於 64B 內 → 免預解碼,直接重複解碼,極大提升循環吞吐。
4 解碼器
- D0:最多 4 uops/週期;D1-D3:各 1 uops/週期。
- ≥4 uops 指令需微碼 ROM 多週期解碼。
- 可從循環緩衝一次讀 2×16B=32B,但受限於預解碼 16B/週期上限。
- 前綴數量限制移除:僅限指令總長 ≤15 bytes。
微碼融合增強
- 讀-修改融合、寫融合;Core 2 支援單指令雙融合(讀-操作-寫)。
- 多數 XMM 指令可融合;融合 uop 擁有 3 輸入相依(普通 2)。
六、 #pragma pack vs __declspec(align) 差異釐清
- align:指定資料起始位址對齊值。
- pack:指定結構體為達到對齊,編譯器最大填充位元組數;僅影響結構體成員佈局。
範例
#pragma pack(4)
struct A { char c; double d1; short s; };
- 結構體對齊 = max(成員對齊) = 8(double),與 pack 無關。
- 成員
c:offset 0(align 1)。
- 成員
d1:理想 offset 8(align 8),但 pack=4 限制填充 ≤4 → 填充 3 bytes,offset 4(align 4)。
- 成員
s:offset 12(align 2)。
- 結構體大小:≥ 最後成員結束 offset (14),對齊至 8 的倍數 → 16 bytes。
MSDN 規則:成員對齊 = min(sizeof(成員), pack);結構體對齊 = max(成員對齊);大小 = 結構體對齊的最小倍數 ≥ 最後成員結束。
結語
掌握 Core 微架構的快取層級、對齊要求、流水線解碼特性、亂序執行窗口,配合編譯器對齊屬性與結構體佈局控制,可編寫充分發揮硬體效能的高性能原生程式碼。