處理器一條指令所經歷的時鐘週期

對於軟件工程師來說,印象流我們可能會覺得執行一條指令一個時鐘週期嘛,一條指令算是一個最小的原子操作,不可能再細分了吧。

如果看了《arm體系架構》等書籍就會了解到,這個問題可沒這麼簡單了,因爲處理器設計中使用了流水線技術。

一條指令還是相當複雜的,處理器在一個時鐘週期內肯定是完不成的,可能需要好多個時鐘週期來完成執行。如果這樣讓處理器執行完一條指令,再去執行另一條,處理器的效率是很低的,假如一條指令是5個時鐘週期完成,對於500MHZ的處理器串行運行指令,1秒內取指100000000次。

因此處理器引入了流水線技術,將一條指令劃分爲多個功能,由不同的功能部件來執行,並且這些功能部件可以並行工作。下面是一個arm7的三級流水線運行圖。

這裏寫圖片描述

流水線劃分爲取指 譯碼 執行,但並不是僅需3個時鐘週期即執行完指令。因爲執行單元模塊的操作較多,可能需要多個週期,取指 譯碼一般是一個時鐘週期,這樣可以看出雖然一條指令完成需要多個時鐘週期,但是總體來說看在每個時鐘週期都有一條指令開始取指。如果我們的處理器是500MHZ,則1秒內取指了500000000次。

不同的處理器設計時流水線級數不一樣,現在主流的有三級 五級 七級,增加流水線級數,簡化流水線的各級邏輯,可以提高處理器的性能。

回答咱們開頭的問題也就明白了,一條指令需要的時鐘週期還真不固定,這得看處理器的流水線級數,也得看該指令的複雜度,在執行階段需要幾個時鐘週期。

對於流水線各級具體工作這裏就不細說了,網上文章很多,畢竟咱們是做軟件的,硬件點到爲止,流水線各級工作是有處理器內部邏輯單元來完成的,對於軟件來說都是不可見的,軟件可操作的最小原子操作就是指令。

不過呢,處理器的流水線技術在有一個事情對咱們軟件造成了影響,那就是PC值。

據我瞭解的處理器流水線設計,前三級基本都是取指 譯碼 執行。處理器的PC寄存器中存儲的是處理器的取指地址,根據上述流水線機制,而我們的處理器執行的指令地址是落後於要去預取的指令的地址,落後2個時鐘週期。

也就是說我們在取了第一條指令後,等該指令到了執行階段時,我們的處理器其實已經預取了往後的第二條指令了。

對於32位處理器,一條指令佔據4字節。這也就是PC值 = 當前指令地址 + 8的根本原因啦。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章