當前位置: 華文問答 > 數碼

為什麽CPU流水線設計的級越長,完成一條指令的速度就越快?

2016-10-24數碼
請問提高主頻和流水線有什麽樣的關系?
流水線設計的步(級)越長,完成一條指令的速度就越快。

這兩個問題一起回答好了。

既然是流水線,就用流水線舉個例子好了。假設一條工廠的流水線,需要給零件擰4種不同規格的螺絲,每種螺絲2個,工人擰一個螺絲需要5秒(工人擰螺絲的時候流水線需要暫停等待),流水線移動一格需要5秒。

對比一下流水線分4級,每個工人擰2個同規格的螺絲,和流水線分8級,每個工人擰1個螺絲相比:

  • 4級流水:完成一個工件的總時間:(5+5+5)×4=60秒;每15秒鐘產出一個工件。
  • 8級流水:完成一個工件的總時間:(5+5)×8=80秒;每10秒鐘產出一個工件。
  • 流水線的移動速度並沒有加快,但是透過更多級的流水線,可以使得流水線的暫停等待時間更短,從1/15 Hz提高到1/10 Hz,頻率更高。

    如果我們再假設一個機制,就是當產出的工件達到一定數量後,就馬上改為生產另一種工件,4級流水只要60秒就能產出第一個工件,而8級流水需要80秒。如果每種工件每生產3個就更換一種,那麽4級流水生產一種工件需要60+15×2=90秒,8級流水生產一種工件需要80+10×2=100秒,反而更慢。這就是過長的流水線帶來的效能下降問題,Intel的Netburst架構,AMD的Bulldozer架構都存在這個問題。

    文中還說「實質是以時間換取空間」

    這個先看原文:

    超純量(superscalar)是指在CPU中有一條以上的流水線,並且每時鐘周期內可以完成一條以上的指令,這種設計就叫超純量技術。 其實質是以空間換取時間。而超流水線是透過細化流水、提高主頻,使得在一個機器周期內完成一個甚至多個操作,其實質是以時間換取空間。

    在上面的例子中,設定8級流水的代價是每個工件的完成時間增加了20秒,這就是這段話中以時間換取空間的意思。

    擴充套件指令集中指令的條數是否受到了制造工藝的限制,如果沒有的話,為什麽不整合更多的擴充套件指令集呢。

    CPU一直在整合更多的擴充套件指令。Intel幾乎每一代CPU都會增加一條或者多條指令;某一代甚至是增加整個指令集,例如大家經常聽到的x87,MMX,SSE,AVX等。不過事實上,因為CPU裏面都是二進制數據,因此理論上一個通用處理器,只要支持最基本的幾種二進制運算就可以實作任何計算。當然,這樣的處理速度會很慢,因為一個很常見的操作,就需要轉換分解成很多步基本運算才能完成。所謂的擴充套件指令,就是把一些常見的基本指令組合用專用的硬件實作,達到一個或者幾個時鐘周期,就可以計算出需要幾百上千步基本運算才能完成的計算。

    但是這樣的組合是無窮無盡的,每一條指令都需要用額外的晶體管來實作,雖然每一次工藝升級,都可以在同樣大小的晶圓面積上擺放下更多的晶體管,但具體到某一代工藝,良率和成本限制所決定的可接受最大芯片面積,能容納的晶體管數量總是有限的。只能由CPU廠商根據業界發展預測將來哪一些指令組合會更頻繁的被使用,並把這些組合用硬件電路實作,固化為新的擴充套件指令。

    舉例來說,我寫一個軟件,經常要計算A×B÷C這樣的組合,但CPU廠家覺得這只是我一個人的情況,所以不會做一個這樣的擴充套件指令;但A×B+C因為是常見的矩陣運算,有很多人用,所以就做了一個FMA指令集。

    指令是否就是指指令集中的指令,

    是的

    他們與終端的軟件程式有什麽關系?

    軟件程式就是一組按照特定順序排列以完成某種特定任務的指令程式碼,以及執行這些指令所必須的數據,按照作業系統約定的某種結構所組成的一組二進制程式碼。

    軟件程式的執行是否全部轉化為這些指令,隨後讓這些指令到處理器的流水線中進行執行?

    是的,CPU流水線的第一階段就是CPU的取指單元從記憶體中載入一段程式,並且按照作業系統約定的格式,從中提取出按順序排列的一串指令程式碼。第二階段是CPU的譯碼單元把這些代碼分解成具體的指令以及指令操作物件(寄存器、記憶體地址或者立即數),某些復雜指令可能還需要再進一步拆分成多條內部指令。