超純量
超純量
超純量又稱超標量,超標量(superscalar)CPU架構是指在一顆處理器內核中實行了指令級并行的一類并行運算。這種技術能夠在相同的CPU主頻下實現更高的CPU吞吐率(throughput)。處理器的內核中一般有多個執行單元(或稱功能單元),如算術邏輯單元、位移單元、乘法器等等。未實現超標量體系結構時,CPU在每個時鐘周期僅執行單條指令,因此僅有一個執行單元在工作,其它執行單元空閑。超標量體系結構的CPU在一個時鐘周期可以同時分派(dispatching)多條指令在不同的執行單元中被執行,這就實現了指令級的并行。超標量體系結構可以視作多指令流多數據流。
超標量體系結構的CPU一般也都實現了指令流水化。但是一般認為這二者是增強CPU性能的不同的技術。
第一個超標量的設計是在1965年Seymour Cray開發的CDC 6600。1984年的Intel i960CA與1987的AMD 29050處理器是第一個量產的單晶粒超標量處理器。這些RISC系統的CPU使用超標量架構,是由於當時RISC的設計的核心較簡單,能夠直接發送指令與調度多種功能性的單位(像是ALU)。這也是在八、九十年代RISC處理器比CISC處理器的運算速度更快的主要原因。
除了那些低功率CPU、嵌入式CPU、以及使用電池電源的CPU,1998年以後開發的CPU設計都已經是超標量體系結構。第一種採用了超標量技術的X86處理器是Pentium。第一批採用了把CISC指令非同步解碼為微指令序列技術的處理器是Nx586,P6體系結構的Pentium Pro以及AMD K5。這使得被緩存的微指令可以動態調度(dynamic scheduling)執行,使得P6架構的并行性更優於P5架構的Pentium;這也使得預測執行(投機執行)更易實現,CPU的時鐘頻率也可以更高。
最簡單的處理器是標量處理器。該處理器執行每個指令通常會在一個時間內操作一個或兩個資料項目。但相較之下,向量處理器執行每個指令能夠同時間運作很多資料項目。而超標量處理器則是將標量與向量處理器混合起來。每個指令處理一個資料項目,但是有多個多餘的處理器內的功能單位能同時處理額外獨立的資料項目。
超標量處理器設計強調增強指令發送的準確度,而且能夠加強很多功能單位的利用度。這樣當單位增加時效能增進就能很明顯。當早期的超標量CPU有兩組ALU與一組FPU的時候,像PowerPC 970較先進的設計就內含四組ALU、二組FPU與一對單指令流多數據流單位。但如果調度器(dispatcher)效率低落,系統的性能將會拖累。
超標量處理器的執行速度通常高於每周期一個指令。但同時處理多個指令不見得就是超標量化,像是管線化CPU與多核心CPU,就是使用不同的方式,來達同時處理多個指令的目的。
而超標量處理器的調度器從內存讀取指令,而且決定要將哪些指令能夠并行處理,將這些指令再調度到CPU內重複的功能單元。因而超標量處理器可以想成它有多個平行的管線,這些管線可以平行處理一個執行緒中指令。
超標量的效能增進會被這兩處限制住:
1.指令流中的本質并行度(degrees of intrinsic parallelism),也就是限制指令級平行的數量。
2.複雜又耗時的調度器的消耗時間與依賴性檢查邏輯電路。
3.分支指令的處理
現有的二進位程式有不同的本質并行度。在部分指令中並不與其他指令互相關聯而能同時執行。而另一部分指令就有相互關聯:一個指令會影響其他指令的資源或結果。像是a=b+c; d=e+f這串指令,因為運算中並不會相互影響而能夠并行運算。但是a=b+c; d=a+f這串指令就可能無法并行執行,是因為指令順序中後面的指令需要前面的運算結果。
當同時發出指令的數量增加,依賴性檢查的成本會大量增加。由於檢查過程中需要CPU參與,這樣會惡化CPU的處理效率。而此成本包含為了實現依賴性檢查而增加的邏輯門,還有在這些邏輯門之間的時間延遲。而研究顯示出邏輯門成本在某些狀況下可能會高達{\displaystyle k^{2}\log n},n是處理器的指令集數量,而k是同時發送的指令數量。在數學領域稱之為排列組合問題。而即使該指令流並沒有任何的指令依賴性,超標量處理器還是要去檢查,這樣子才能確保結果不會錯誤。而無論半導體製程是多麼進步,或是切換速度是多麼的快,同時發送的指令數量還是有一個限制在。當更新進的製程允許更多的功能性單位內建其中(像是ALU),但是指令依賴性檢查成長得太快以至於超標量調度限制還是感覺很小,既使同時有五到六個指令同時調度進去。
然而即使將無限快的依賴性檢查邏輯電路內建於超標量CPU,如果指令流自己有很大的依賴性,這樣還是可能會限制住效能。這樣在源碼流之間的本質平行度就會形成第二個限制。
綜合來說,這兩個限制驅使研究轉向其他的效能增進架構,例如超長指令字(VLIW)、顯式并行指令計算(EPIC)、同步多執行緒(SMT)和多核心處理器。
同步多執行緒通常縮寫為SMT,目的是為了改進超標量處理器的總體效率。此架構允許多個獨立的執行緒更佳的利用現代處理器架構的資源。
超標量處理器不同於多核心處理器之處,在於多餘的功能單元無法構成完整的處理器。一個處理器由多個較細粒度的功能單元所組成,例如算術邏輯單元(ALU)、整數乘法器、整數位移器、浮點運算器等等。每個功能單元可能存在複數版本,使得多個指令能平行執行。此做法不同於多核心處理器,後者使用多個執行緒(一核一緒)同時地處理指令;也不同於管線化處理器- 複數指令可以同時存在於不同的執行階段,就像工廠裝配線一樣。
這些替代技術並非互斥,他們可以(經常是)被合併使用到單一處理器上。因此一顆多核心處理器可能是這樣,每個核心包含複數個平行管線,每個管線都是超標量。有些處理器還擁有向量處理的能力。
• Hyper-Threading
• 并行多工
• 預測執行/及早求值
• 軟體停滯,會出現於多處理器系統,由於超標量的邏輯依賴性造成的現象。