計算機組成原理6-流水線、多發射和超標量、SIMD、異常


 

1、完整功能的CPU有3個周期概念:指令周期、機器周期、時鍾周期

2、一條CPU指令的執行步驟:取得指令-指令譯碼-執行指令,這個過程至少花費一個時鍾周期。

    單指令周期處理器:一個周期內,只執行一條指令。這樣就需要保證時鍾周期等於執行時間最長的指令時間。這樣時鍾頻率就不能太高,否則指令可能還沒有執行完成就開始執行下一條指令,而之前的指令計算結果還沒有存到寄存器中。


這樣的CPU實際效率並不高


3、流水線

    CPU 的指令執行過程,其實也是由各個電路模塊組成的。在取指令的時候,需要一個譯碼器把數據從內存里面取出來,寫入到寄存器中;在指令譯碼的時候,需要另外一個譯碼器,把指令解析成對應的控制信號、內存地址和數據;到了指令執行的時候,需要的則是一個完成計算工作的 ALU。把時鍾周期設置成整條指令執行的時間,而是拆分成完成這樣的一個一個小步驟需要的時間。同時,每一個階段的電路在完成對應的任務之后,也不需要等待整個指令執行完成,而是可以直接執行下一條指令的對應階段。


 

不需要確保最復雜的那條指令在時鍾周期里面執行完成,而只要保障一個最復雜的流水線級的操作,在一個時鍾周期內完成就好了。


4、 超長流水線

    流水線並沒有縮短單條指令的響應時間,但是可以增加運行很多條指令時候的吞吐率。

    流水線深度的增加,需要的電路數量變多了,也就是使用的晶體管也就變多了。過深的流水線,不僅不能提升計算機指令的吞吐率,更會加大計算的功耗和散熱問題。而流水線帶來的吞吐率提升,只是一個理想情況下的理論值。在實踐的應用過程中,還需要解決指令之間的依賴問題。這個使得流水線,特別是超長的流水線的執行效率變得很低。要想解決好冒險的依賴關系問題,需要引入亂序執行、分支預測等技術。


5、關於多發射和超標量

    通過增加硬件的方式,將取指令和指令譯碼實現並行,一次性取出多條指令,然后分發給多個並行的指令譯碼器,進行譯碼,然后對應交給不同的功能單元去處理。這樣,在一個時鍾周期里,能夠完成的指令就不只一條了。這種 CPU 設計,叫作多發射(Mulitple Issue)和超標量(Superscalar)。

    多發射是指將多條指令同時發射到不同的譯碼器或者后續處理流水線中。

    超標量的CPU里面有很多並行的流水線,而不是單一一條。



6、單指令多數據流

    SIMD 在獲取數據和執行指令的時候,都做到了並行。一方面,在從內存里面讀取數據的時候,SIMD 是一次性讀取多個數據。對於那些在計算層面存在大量“數據並行”(Data Parallelism)的計算中,使用 SIMD 是一個很划算的辦法。在這個大量的“數據並行”,其實通常就是實踐當中的向量運算或者矩陣運算。在實際的程序開發過程中,過去通常是在進行圖片、視頻、音頻的處理。最近幾年則通常是在進行各種機器學習算法的計算。


7、計算機是如何處理異常的

    關於異常,最有意思的一點就是,它其實是一個硬件和軟件組合到一起的處理過程。異常的前半生,也就是異常的發生和捕捉,是在硬件層面完成的。但是異常的后半生,也就是說,異常的處理,其實是由軟件來完成的。

    計算機會為每一種可能會發生的異常,分配一個異常代碼(Exception Number)。有些教科書會把異常代碼叫作中斷向量(Interrupt Vector)。異常發生的時候,通常是 CPU 檢測到了一個特殊的信號。比如,按下鍵盤上的按鍵,輸入設備就會給 CPU 發一個信號。或者,正在執行的指令發生了加法溢出,同樣,可以有一個進位溢出的信號。這些信號呢,在組成原理里面,一般叫作發生了一個事件(Event)。CPU 在檢測到事件的時候,其實也就拿到了對應的異常代碼。

 

    這些異常代碼里,I/O 發出的信號的異常代碼,是由操作系統來分配的,也就是由軟件來設定的。而像加法溢出這樣的異常代碼,則是由 CPU 預先分配好的,也就是由硬件來分配的。這又是另一個軟件和硬件共同組合來處理異常的過程。

    拿到異常代碼之后,CPU 就會觸發異常處理的流程。計算機在內存里,會保留一個異常表(Exception Table)。也有地方,把這個表叫作中斷向量表(Interrupt Vector Table),好和上面的中斷向量對應起來。

 

     CPU 在拿到了異常碼之后,會先把當前的程序執行的現場,保存到程序棧里面,然后根據異常碼查詢,找到對應的異常處理程序,最后把后續指令執行的指揮權,交給這個異常處理程序。

8、異常分類:中斷、陷阱、故障和中止

    第一種異常叫中斷(Interrupt)。顧名思義,自然就是程序在執行到一半的時候,被打斷了。這個打斷執行的信號,來自於 CPU 外部的 I/O 設備。在鍵盤上按下一個按鍵,就會對應觸發一個相應的信號到達 CPU 里面。CPU 里面某個開關的值發生了變化,也就觸發了一個中斷類型的異常。

 

    第二種異常叫陷阱(Trap)。陷阱,其實是程序員“故意“主動觸發的異常。就好像你在程序里面打了一個斷點,這個斷點就是設下的一個"陷阱"。當程序的指令執行到這個位置的時候,就掉到了這個陷阱當中。然后,對應的異常處理程序就會來處理這個"陷阱"當中的獵物。

 

    第三種異常叫故障(Fault)。它和陷阱的區別在於,陷阱是開發程序的時候刻意觸發的異常,而故障通常不是。比如,在程序執行的過程中,進行加法計算發生了溢出,其實就是故障類型的異常。這個異常不是我們在開發的時候計划內的,也一樣需要有對應的異常處理程序去處理。

    故障和陷阱、中斷的一個重要區別是,故障在異常程序處理完成之后,仍然回來處理當前的指令,而不是去執行程序中的下一條指令。因為當前的指令因為故障的原因並沒有成功執行完成。

    最后一種異常叫中止(Abort)。與其說這是一種異常類型,不如說這是故障的一種特殊情況。當 CPU 遇到了故障,但是恢復不過來的時候,程序就不得不中止了。

 


 



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM