SSE3

SSE3（Streaming SIMD Extensions 3），又稱PNI（Prescott New Instructions）Prescott是Intel公司產品Pentium 4處理器的專案代稱，也稱為研發代號。，它指的是：在原有架構的處理器中，所第三次額外新增、添加的多媒體指令集，之前的兩次分別是SSE、SSE2。

SSE3是Intel公司所其原有IA-32架構的處理器所研創，並在2004年初的新款Pentium 4（P4E,Prescott核心）處理器研發代號：Prescott。Prescott是地名也是人名，美國、英國、加拿大皆有地方取名為Prescott，另有許多人的姓氏也為Prescott，如William Prescott（美國革命指揮官）、Richard Prescott（美國革命時期的英國將軍，曾兩度被擒）中使用，之後2005年4月AMD公司也發表具備部分SSE3功效的處理器：Athlon 64（E3步進核心）研發代號：威尼斯（Venice）與聖地牙哥（San Diego），此後的x86處理器也幾乎都具備SSE3的新指令集功能。

此外，在SSE3提出之前，x86架構的處理器先後已有多種多媒體指令集被提創與使用，先後順序大致是Intel MMX、AMD 3DNow!此外也有Cyrix公司提出的EMMI多媒體指令，不過僅短暫提出，之後並未普及使用。、Intel SSE、Intel SSE2等。

附帶一提的是，SSE3比在它之前的SSE2增加13條新指令。

 新指令所帶來的改變 
SSE3最值得一提的新功效特點，是水平式的暫存器整數運算，而在此之前的SSE、SSE2則僅能垂直運算。更進一步的特點是，指令執行時對多筆數值的同時加法運算、減法運算等，之後將結果進行儲存等，都可以在單一個暫存器完成，因此SSE3可以用更簡單的方式來實現同時間的多筆、大量DSP、3D性質的運算。

此外，有個新指令可將浮點數數值轉換成整數數值，且進行此種轉換不需要將運算切換到rounding模式，過去此類轉換必須先切換至rounding模式，完成轉換後再退出rounding模式，此新指令可省去此模式切換程式，使整體運算更為加速，也因此可避免鄰近執行管線（Instruction pipeline）因此而停緩、等待（模式切換會使後續執行暫停，進而減損運算效能）。

另外，新增設的LDDQU指令能夠在交替載入長度不一的整數向量值時獲得更佳的效能，此指令可以讓Intel NetBurst架構的執行核心跨越快取線的界線而進行數值載入。

 具備SSE3硬體支援功效的處理器 

以下表列依據業者英文名稱的字母順序：

AMD公司：
Athlon 64 - 從Stepping E3的Venice（威尼斯，研發代號）以及Stepping E4的San Diego（聖地牙哥，研發代號）開始具備。
Athlon 64 X2
Athlon 64 FX - 從Stepping E4的San Diego（聖地牙哥，研發代號）開始具備。
Opteron - 從Stepping E4的San Diego（聖地牙哥，研發代號）開始具備。
Sempron - 從Stepping E3的Palermo（研發代號）開始具備。
Turion 64
Turion 64 X2
Phenom
Phenom II
Intel公司：
Celeron D
Pentium 4 - 從Prescott（研發代號）開始具備。
Pentium D
Intel Core
Intel Core 2
Intel Core i7
Xeon - 從Nocona（研發代號）開始具備。
全美達公司（Transmeta）：
Efficeon TM88xx（不包含型款編號為TM86xx系列的處理器）
威盛電子（VIA）研發團隊收併自美國IDT公司所100%轉投資的Centaur公司:
VIA Isaiah
C7-M
C7-D

 新增的指令 
 共通性的指令 
算術指令（Arithmetic）
 ADDSUBPD - （Add-Subtract-Packed-Double）
 輸入： - { A0, A1 }, { B0, B1 }
 輸出： - { A0 - B0, A1 + B1 }

 ADDSUBPS - （Add-Subtract-Packed-Single）
 輸入： { A0, A1, A2, A3 }, { B0, B1, B2, B3 }
 輸出： { A0 - B0, A1 + B1, A2 - B2, A3 + B3 }

陣列結構指令（Array Of Structures；AOS）
 HADDPD - （Horizontal-Add-Packed-Double）
 輸入： { A0, A1 }, { B0, B1 }
 輸出： { B0 + B1, A0 + A1 }

 HADDPS （Horizontal-Add-Packed-Single）
 輸入： { A0, A1, A2, A3 }, { B0, B1, B2, B3 }
 輸出： { B0 + B1, B2 + B3, A0 + A1, A2 + A3 }

 HSUBPD - （Horizontal-Subtract-Packed-Double）
 輸入： { A0, A1 }, { B0, B1 }
 輸出： { A0 - A1, B0 - B1 }

 HSUBPS - （Horizontal-Subtract-Packed-Single）
 輸入： { A0, A1, A2, A3 }, { B0, B1, B2, B3 }
 輸出： { A0 - A1, A2 - A3, B0 - B1, B2 - B3 }

 LDDQU - 如上所述，這是有交替需求時所用的指令，可以載入（load）不整齊排列的整數向量值，此指令對視訊壓縮的運算工作有幫助。

 MOVDDUP、MOVSHDUP、MOVSLDUP - 此三個指令是針對複雜數目需求時所用，對波形信號的運算有幫助，例如音訊的聲波波形處理。

 FISTTP - 類似過去x87浮點運算中的FISTP指令，不過此指令的運算執行或忽略掉浮點控制暫存器的rounding（溢繞）模式的設定，並且用“chop”（truncate，截切）模式所謂rounding模式是暫存器的內存值溢位時，溢位會使內存值歸零再進行持續遞增，舉例而言，一個8-bit的暫存器，當其值為255時，若再加2即會變成1，就二進制來看即是11111111 + 00000010 = 00000001。而所謂chop模式是即便溢位也不歸零，而持續維持在最高數值，此也稱為飽和運算，即是不讓其溢位歸零情事發生，同樣的例子，在chop模式下依舊會維持255，即是11111111 + 00000010 = 11111111。
當然，截切、飽和忽略了更多的累加值，這在多媒體運算時有其需要，當音調254階再增個2階、3階，若因為溢位歸零而成為0階、1階，就會與255階相去甚遠，相對的254階若因飽和運算的效果最多會維持在255階，255階與254階仍是相近，多媒體運算力求快速即時而不力求精確，因此些許的運算數字結果偏差仍可接受。取代。允許控制暫存器忽略繁重的載入及再載入，例如C語言中將浮點數轉換成整數就需要使用此種截切效果，且此種截切程序已成為C語言中的標準作法。

 Intel針對SSE3所額外設計的自用指令 
 MONITOR、MWAIT - 此二個指令能針對多執行緒的應用程式進行執行最佳化，使處理器原有的超執行緒功效獲得更佳的發揮。

 附註說明 

 參考引據 
 X-bit Labs網站：SSE3指令集（2004年2月1日）

 關連條目 
 SIMD - SSE3指令集的特性原理基礎。
 SSE
 计算机编码
 SSSE3 - SSE3指令集的擴充

 外部連結 
Intel官方網站對SSE3的總覽說明 

Category:并发计算
Category:X86架構
Category:X86指令