指令排程是編譯優化中用於提高指令級並行,從而提高在計算機上指令流水線的效能。更直接的說,在沒有改變原**語義的情況下,它做了下面兩件事:
1. 通過重排指令順序避免指令流水線停頓;
2. 避免非法或語義模糊的操作(涉及典型的細微的指令流水線時序問題或非互鎖的資源);
指令流水線停頓可能是由結構危險(處理器資源限制),資料危險(輸出另一條指令所需的一條指令),控制危險(分支);
為了能產生快速的**,**生成階段重排指令,以照顧目標機器在特定方面的效能約束。
不同操作指令的執行時間可能是不同的。記憶體訪問操作可能需要花費幾十甚至數百個cpu週期,但某些算術操作(除除法為例),需要幾個cpu週期。這種延遲較長的操作對編譯後**效能的影響可能是驚人的。
以下面的例子來簡單說明指令排程:假定目前loadai或storeai操作需要3個週期,mult操作需要2個週期,而所有其他操作都只需1個週期。下表給出了乙個**片段,並在開始列
給出了每個操作開始執行的週期,在結束列
給出了操作完成的時間。
開始列結束列
code13
loadai rarp, @a => r1 // 載入』a』44
add r1, r1 => r1 // r1 = a * 257
loadai rarp, @b => r2 // 載入』b』89
mult r1, r2 => r1 // r1 = (a * 2) * b
1012
loadai rarp, @c => r2 // 載入』c』
1314
mult r1, r2 => r1 // r1 = (a * 2 * b) * c
1517
loadai rarp, @d => r2 // 載入』d』
1819
mult r1, r2 => r1 // r1 = (a * 2 * b * c) * d
2022
storeai r1 => rarp, @a // 儲存r1到』a』變數
9個操作的指令序列花費了22個週期執行。最小化暫存器的使用並未導致執行變快。
許多處理器都有一種特性,可以在長延遲操作執行期間發起新的操作。只要新操作完成之前不引用長延遲操作的結果,執行都可以正常地進行。
但如果某些插入的操作試圖過早地讀取長延遲操作的結果,處理器將延緩執行需要該值的操作,直至長延遲操作完成。在運算元就緒之前,操作是不能開始執行的,而操作結束之前,其結果也是無法讀取的。
指令排程器重排**中的各個操作。它試圖最小化等待運算元所浪費的週期數。當然,排程器必須確保,新指令序列產生的結果與原來的指令序列是相同的。在很多情況下,排程器可以大幅度改進「樸素」**的效能。對於我們的例子,好的排程器可能產生下列指令序列,如下表:
開始列結束列
code13
loadai rarp, @a => r1 // 載入』a』24
loadai rarp, @a => r2 // 載入』b』35
loadai rarp, @a => r3 // 載入』c』44
add r1, r1 => r1 // r1 = a * 256
mult r1, r2 => r1 // r1 = (a * 2) * b68
loadai rarp,@d => r2 // 載入』d』78
mult r1, r3 => r1 // r1 = (a * 2 * b) * c910
mult r1, r2 => r1 // r1 = (a * 2 * b * c) * d
1113
storeai r1 => rarp, @a // 儲存r1到』a』變數
**的這個版本僅需要13個週期執行。與最小數目相比,該**使用的暫存器多乙個。在這以指令序列中,除8,10,12週期之外,每個週期都開始乙個操作。其他等價的排程也是有可能的,但與之等長的排程一般需要使用更多的暫存器。
正如上面看到的,變異種大多數正真的困難出現在**生成階段。而且這些問題相互影響,使得情況更為複雜。例如,指令排程移動load操作,使之遠離依賴的load的算術操作。這樣做可以增加需要這些值的時間段,但此期間內所需的暫存器的數目也會相應地增加。類似地,將特定的值賦值給特定的暫存器,可以在兩個操作之間建立「偽」相關性,從而限制指令排程。(在第乙個操作完成之前第二個操作不能排程執行,即使在公用暫存器中的值並無依賴性。重新命名該值可以消除這種偽相關性,代價是使用更多暫存器。)
編譯器是乙個超級複雜的工程。好的編譯器合併了來自形式語言理論,演算法研究,人工智慧,系統設計,計算機體系結構和程式語言理論的思想,並將其應用到程式轉換的問題上。
征服編譯器很困難,加油吧。。。
《engineering a compiler》
《程序排程》1 排程原理與基礎概念
在正式介紹程序排程的細節前需要對一些概念作出介紹 程序排程的職責 負責決定在什麼時間,將那個程序投入使用,以及程序執行的時間。從而達到系統資源最大限度發揮,多程序併發執行的效果。1 就緒和執行狀態 task running 此時程式已經被掛入執行佇列,處於準備執行的狀態,一旦獲得處理器的使用許可權,...
伺服電機概念原理介紹
1 概念 伺服電機 servo motor 是指在伺服系統中控制機械元件運轉的發動機,是一種補助馬達間接變速裝置。伺服電機可使控制速度,位置精度非常準確,可以將電壓訊號轉化為轉矩和轉速以驅動控制物件。伺服電機轉子轉速受輸入訊號控制,並能快速反應,在自動控制系統中,用作執行元件,且具有機電時間常數小 ...
LDAP概念和原理介紹
ldap概念和原理介紹 相信對於許多的朋友來說,可能聽說過ldap,但是實際中對ldap的了解和具體的原理可能還比較模糊,今天就從 什麼是ldap ldap的主要產品 ldap的基本模型 ldap的使用案例 四個方面來做乙個介紹。我們在開始介紹之前先來看幾個問題 1.我們日常的辦公系統是不是有多個?...