近年的 CPU 除了前一節談過的基本參數之外,通常還有很多「技術特性」加持,這些技術能提供某些額外的功能或是提升運算性能,因此要了解 CPU 的規格,對這些技術的簡單了解是不可或缺的!一般而言,處理器的技術特性有指令集與專屬技術兩大類,本節將先探討指令集的部分。
不過由於指令集實際上是很複雜的東西,需要有資工系必修課程-計算機組織甚至是研究所課程的計算機結構的概念才能比較深入理解,因此本篇將比較偏向於介紹知名指令集的年代、歷史與其作用,目的在於下次看到時能讓你不致於完全不知道這些名詞代表什麼。
Table of Contents
處理器指令集簡介
首先介紹什麼是「指令集」,其實指令集就是一款處理器所能支援執行的所有指令的總集合,就稱之為指令集,英文用詞為 Instructions。
其實我們先前所討論過的「x86 架構」就是一群指令集的結合,除了一般用於基本運算的指令之外,為了提高運算性能,CPU 廠商也會在 CPU 中將經常會使用到的功能設計成額外的指令,以節省執行這些功能時所花費的時間,這樣的做法就是「Make common case fast」,讓經常用到的功能跑得比較快,在整體性能提升上會有比較明顯的效果。
而本節當中所要討論的指令集實際上都是 x86 架構指令集的「延伸」,但在用詞上我們同樣習慣稱呼這些「擴充套件」為指令集。
目前而言絕大多數的處理器指令集都是為了多媒體而加強。由於指令集的部分要深入了解需要有計算機組織與組合語言的概念,因此站長在這篇不會詳談。
MMX
起用年代:1996 年至今,首款產品為 Intel Pentium Processor with MMX Technology
MMX (Matrix Math eXtensions 矩陣數學擴充) 可以說是 x86 架構中多媒體指令集的始祖,具有 57 條指令,主要功能為強化多媒體資料的處理能力,所以亦有譯為 Multi Media eXtensions 者,基本上從 1997 年以後你所能看到的 CPU 大概都具備 MMX 支援,同時 MMX 也是後來的 SSE 家族與 AMD 專屬的 3D Now! 指令集家族的基礎,以向量寬度而言,MMX 只支援到 64-bit。
↑ 第一款支援 MMX 技術的處理器 (Pentium)
不過距今年代已遠,基本上現在已經看不到純粹使用 MMX 優化的程式了。
3D Now!
起用年代:1998 年至 2011 年,首款產品為 AMD K6-2 Processor (AMD 於 2010 年宣布將拋棄 3D Now! 指令集)
3D Now! 指令集是由 AMD 基於 MMX 指令集設計的 SIMD 多媒體指令集,支援單精度的向量運算,總共有 21 條指令,發佈的時間點正好是 3D 電腦圖形剛開始發展的時候,要說這套指令集陪伴 AMD 一路成長,可是一點也不為過。首次出現於 AMD 的 K6-2 系列處理器,當時有許多遊戲廠商與微軟的 DirectX 7 為 3D Now! 指令集進行優化,因此優於 Intel 的遊戲性能帶來了一時的聲名大噪,Intel 的所有處理器都不支援 3D Now! 指令集。
↑ AMD K6-2 處理器
之後 AMD 在 1999 年推出 AMD Athlon 時則是在原有的 3D Now! 指令集中再新增 5 條指令,增強 DSP 方面的性能,稱之為「Enhanced 3D Now!」。
↑ AMD Athlon 家族處理器
SSE
起用年代:1999 年至今,首款產品為 Intel Pentium !!!
SSE 指令集可說是近代個人電腦處理器數一數二重要的多媒體指令集,全名為 Streaming SIMD Extensions,是 Intel 針對 AMD 3D Now! 指令集進行的反擊,基礎仍舊來自於 MMX,SSE 提供了 70 條的新指令,由於 3D Now! 能做到的,SSE 幾乎都做得到,甚至能夠做得更好,因此 Intel 瞬間將 AMD 暫時的優勢地位翻轉了回來。
SIMD 的意思是「Single Instruction, Multiple Data」,也就是單一指令能處理多個數據操作的意思,此外 SSE 支援的向量長度比 MMX 多出一倍,來到了 128-bit。
之後 AMD 則是在 2001 年推出的 Athlon XP 系列中加入了對 SSE 的完整支援 。
SSE2
起用年代:2001 年至今,首款產品為 Intel Pentium 4 (Willamette)
↑ 第一代 Intel Pentium 4 (Willamette) 首次支援 SSE2。
SSE2 是 SSE 的延伸,新增了 144 條指令,同時具有完全取代 MMX 的能力,AMD 則在 2003 年推出 AMD64 系列處理器時納入 SSE2 的支援。
SSE3
起用年代:2004 年至今,首款產品為 Intel Pentium 4 (Prescott)
↑ 第三代 Intel Pentium 4 (Prescott) 加入對 SSE3 的支援。
SSE3 是 Intel 為 Pentium 4 後期的核心 (代號 Prescott) 新增的 SSE 系列指令,因此又被稱為 PNI (Prescott New Instructions),SSE3 新增了 13 條新指令,其中有 2 條新指令是針對 Hyper-Threading 技術而設計的,而 AMD 則在 2005 年之後開始將 SSE3 用於自家產品上 (但不包含 2 條 Hyper-Threading 優化指令)
SSSE3
起用年代:2006 年至今,首款產品為 Intel Core 2 (Conroe)
SSSE3 (Supplemental Streaming SIMD Extensions 3) 是 SSE3 的補充,新增了 16 組 (每組有兩種,分別用於 64bit 與 128bit 的暫存器中) 指令,AMD 則是要從 2011 年的推土機架構 (Bulldozer) 才開始支援。
SSE4 家族
起用年代:2008 年至今,首款產品為 Intel Core 2 (Penryn)
SSE4 的歷史相對於上面幾項來說複雜了不少,首先看 Intel 的部分,實際上 Intel 將 SSE4 分為 SSE4.1 與 SSE4.2 兩個,其中 SSE 4.1 有 47 條新增指令,從 Intel Core 2 (Penryn) 開始就能看到,SSE 4.2 則包含 7 條指令,直到 2007 年的 Nehalem 才納入。
AMD 的話當時則是在 2007 年的 Barcelona 核心也新增了命名為 SSE4a 的指令集,只包含兩條指令,實際上與 Intel 的 SSE4 沒有什麼關聯,只是命名上故意想造成混淆而已。
胎死腹中的 SSE5
2007 年八月 AMD 幹了一件很幼稚的事情,如同前面所說我們知道 SSE 系列的各個指令集其實都是 Intel 制定的,沒想到在 SSE4 產品都還沒出的時間點,AMD 就突然發布新聞稿與規格書,表示他們將在 2008 ~ 2009 推出支援 SSE5 的 CPU,此舉當然讓 Intel 不開心了,於是 Intel 就直接宣布「我們將不會支援 SSE5」,由於指令集實際上是編譯器優化的工具之一,若使用這種指令集的人很少,就不太容易讓人有動力去開發能夠針對這種指令集優化的編譯器,造成的直接結果就是這指令集會變得一點用處也沒有,所以當時消息一出真的讓許多人跌破眼鏡。
最後的結局嘛,SSE5 終究從來沒有在正式產品上出現過,AMD 最後也妥協改使用 Intel 後來提出的新指令集的方式重新設計 SSE5,並放棄 SSE5 的名稱,也就是後來的 AVX,而部分沒有出現在後來 AVX 的功能,則是被 AMD 拆分為 FMA4、XOP、CVT16 三個功能。
Intel AES-NI
起用年代:2008 年至今,首款產品為第一代 Intel Core Processor Family (部分型號)
AES-NI 的全名是 Advanced Encryption Standard New Instructions (進階加密標準新指令),是少數與多媒體比較沒有關係的指令集,主要是針對信任計算 (Trusted Computing) 與加密、解密性能提升而設計的指令集,新增了 7 條指令,AMD 則從推土機架構開始跟進。
↑ 第一代 Core i7 處理器 (Nehalem) 引入了 AES-NI。
AVX
起用年代:2011 年至今,首款產品為 Intel Sandy Bridge 架構處理器與 AMD 推土機 (Bulldozer) 架構處理器
AVX 的全名是 Advanced Vector Extensions (高級向量擴展指令集),某種程度上概念來自 AMD 當年胎死腹中的 SSE5,因此其實可以看做是 SSE 家族的後續,簡單來說是將原有的暫存器 (XMM Registers) 的長度全部增加一倍,由 SSE 的 128 bit 提升為 256 bit (YMM Registers),因此能夠提高處理器在處理特定向量與浮點數運算時的效率,主要帶來的提升也是在多媒體方面,例如影片編碼等等浮點運算量大的時候。在極端情況下可以提高到兩倍 (當然實際情況不可能這麼強大)。
另一方面 AVX 透過支援三運算子指令 ( 3-Operand Instructions),因此可以減少在編碼過程中需要複製資料到暫存器的次數,提高了執行向量運算時的效率。
值得注意的是,AVX 指令集需要作業系統的額外支援,Windows 系統至少需要 Windows 7 Service Pack 1 (需要安裝額外的更新) 或是 Windows 8 以上。
FMA3、FMA4
起用年代:2011 年至今,首款產品為 AMD Bulldozer 架構處理器。
FMA3 與 FMA4 實際上原先是 SSE5 的一部分,是 AMD 的 SSE5 作戰失敗之後被拆出來的功能,因此你只會在 AMD 的處理器上看到 FMA3 與 FMA4。
而對到 Intel 的處理器來看,AVX 基本上是包含 FMA3 的,也就是前面說過的三運算子指令 ( 3-Operand Instructions),這部分由於站長沒有深入去看原始規格,所以大概只能這樣描述,畢竟其實本來就是兩大廠之間商業互鬥的結果。
至於 FMA4,顧名思義其實就是對四運算子指令的支援。
AVX2
起用年代:2013 年至今,首款產品為 Intel Haswell 架構處理器。
↑ 第四代 Core 家族 (Haswell) 處理器引入 AVX2 支援。
AVX2 顧名思義是 AVX 的升級版本,透過增加兩個 FMA (Fused Multiply-Add,熔合乘法累積單元) 來達到強化浮點運算能力的效果,每個 FMA 可以支援 8 個單精度或 4 個雙精度浮點數。
此外,AVX2 也將 AVX 中未被擴充的整數向量運算指令擴充到與浮點數相同的 256-bit,因此在極端狀態下,「理論上」AVX2 可以達到以往將近兩倍的整數運算性能。
Intel TSX-NI
起用年代:2013 年至今,首款產品為 Intel Haswell 架構處理器。
說起來這個指令集有點難解釋,全名叫做 Transactional Synchronization Extensions,翻作事務性同步擴展指令集。
官方的說法是主要用來提升多線程 (Multi-threading) 下的性能,原理上大致是從硬體層著手去改良在多線程或多核心狀況下會遇到的鎖定 (lock) 問題的處理方針,不過需要軟體的支援,因此這主要是比較針對軟體工程師的技術,一般人大概是感受不到什麼差別。
不過說到 TSX-NI,比較廣為人知的可能反而是這則新聞:在 Haswell 與部分 Broadwell 架構核心的處理器上,TSX-NI 指令有重大缺陷,會導致系統發生預期以外的行為。
當時 Intel 的做法很簡單,直接將 TSX-NI 從 BIOS 端關掉就沒事了,嗯,所以目前能用到 TSX-NI 指令的人,大概是少數中的少數吧,Skylake 的部分應該是沒有這問題的,不過接下來的 HEDT 高階平台是 Broadwell-E,中階以上伺服器是 Broadwell-EP 跟 Broadwell-EX 呢……
AVX-512
起用年代:2017 年 (預計),首款產品預定為 Skylake-EP (中高階伺服器用 Skylake)。
AVX-512 實際上是一個非常亂的指令集,分成許多組別,在不同用途的處理器上可能會提供不一樣的組別 (目前已知有 F、CDI、ERI、PFI、BW、DQ、VL 等組合),其中只有 AVX-512F 是一定有的 (F 是 Foundation 的意思)。
目前來說大概就認知到 AVX-512 會將向量的處理能力再次翻倍來到 512-bit 就可以了,其他規格會不會變其實還很難說,而且短期內一般人應該是碰不到有支援 AVX-512 的處理器的。
呼,終於介紹完常見的指令集了,其實這長度應該已經能分成上、下兩篇的,不過因為指令集坦白說不是什麼很有趣的東西,因此站長後來想想,還是乾脆一次出完早點把這個主題結束吧 XD
下次的主題應該會比較貼近大家現在已有的認識吧?例如 Hyper-Threading (HT) 等等技術的簡單介紹。
「電腦達人養成計畫 2-2:帶你看懂 CPU 規格」<< PREV
NEXT >>「電腦達人養成計畫 2-4:HT、XD?帶你認識這些技術名稱」