聶鑫,羅劍
(1.武漢工程大學計算機科學與工程學院,武漢430205;2.武漢晴川學院計算機學院,武漢430205)
遺傳算法[1]是一種從生物界繁衍進化中學習得到的一種隨機搜索算法。這種算法具有很好的魯棒性,具有天然的內在并行性,并且算法無需豐富的先驗知識。目前絕大多數遺傳算法均使用純軟件實現,這類軟件方式在求解實際問題時由于效率較低,運行時間較長,無法應用于實時性要求較高的場合。考慮到遺傳算法中編碼基本采用二進制編碼,而二進制編碼在硬件系統中具有操作快捷,實現簡單的特點,不少學者使用純硬件實現了遺傳算法[2]。使用硬件方式[3]實現的遺傳算法已經證明了具有更高的運算效率與速度。但是純硬件的設計一旦實現,硬件結構就不能改變,所以也就只能對一個問題進行求解,缺乏了軟件所具有的通用性。
軟硬件協同設計(Hardware/Software Co-Designing)的思想是在硬件和軟件設計過程中盡最大限度的利用其協同作用來滿足系統的要求。自從軟硬件協同思想提出以后,一直備受國內外研究者的關注,關于軟硬件協同設計領域的研究也十分活躍。到目前為止,國內外學者已經在此方面做過很多研究[4-6],例如在遙感影像的實時效應、音頻編碼算法、Lattice譯碼算法、數字電路仿真、系統的模擬、仿真和調試等一些方面都使用過軟硬件協同設計方法,并且獲得比使用傳統的設計方法更好的效果。因此利用軟硬件協同設計方法不僅可以提高求解問題的效率,同時可以擴寬其應用領域,進一步推動軟硬件協同設計的發展等。FPGA的快速發展,也為軟硬件協同工作搭建了平臺,使得軟硬件協同處理成為了可能。
綜合軟硬件各自的優點,采用軟硬件協同的工作方式實現的系統[7-8],將系統中一些底層簡單而重復,特別是能夠并行化的工作交由硬件完成,將具有通用性、串行的工作交由軟件完成,不僅可以是系統的效率得提升,縮短了系統的開發周期,并且使得系統具有可重用性。在軟硬件協同中,如何劃分軟硬件具體工作是一件重要的事。因為這涉及到設計的運行效率以及具體實現的功能。我們對遺傳算法軟硬件劃分確定,硬件部分為總控模塊、選擇模塊、編譯模塊、雜交模塊。軟件部分為隨機數模塊、適應值評價模塊。整個系統的設計圖為圖1所示。

圖1 系統設計圖
由于在設計平臺中,CPU(PowerPC)時鐘頻率(300MHz)與FPGA提供的時鐘頻率(100MHz)不一致,并且在CPU上運行的軟件程序完成所需要的時鐘周期數是不確定性的。由于在本設計中存在許多軟件層面與硬件層面的信息交互,為了保證信息交互的同步性,可靠性,必須設計一個通信協議來確保數據的正確性。
圖2描述的為硬件端向軟件端請求數據的操作。整個操作的流程如下,首先由硬件發出請求(request)信號,該信號為高信號。在軟件端收到這個請求信號之后,開始進行正常的工作。此時硬件端為阻塞狀態。當軟件端處理完成之后,給硬件端發送完成信號(done),該信號電平同樣為高。此時軟件端進入阻塞狀態。至此完成一次握手,這該次握手操作中確保了軟件能正確地響應硬件的請求,并且能正確地通知硬件何時完成操作。在硬件端收到電平為高的done信號之后,硬件解除阻塞并且獲取從軟件發過來的數據,之后再發送低電平的request信號并且進入阻塞狀態。此時完成了該協議的第二次握手,這次握手確保了硬件能夠正確地獲取所需信息并且進行標記信號的重置。在軟件獲得低電平的request之后,發送低電平的done信號并且解除阻塞。此時軟硬件的工作基本完成,為了防止重復響應以及再次爭取的響應,必須將交互信號進行重置。重置這些信號就需要該協議的第三次握手來確保雙方同時重置。硬件端收到低電平的done信號之后,解除阻塞。至此,一次軟硬件的信息交互結束。

圖2 通信協議
在本設計中,在雜交模塊,變異模塊,初始化模塊以及總控模塊中都是用了該協議來確保軟硬件雙方信息交互的正確性。
如圖3所示,本模塊中共有6個狀態:

圖3 系統運行狀態機
●IDLE:空閑狀態,系統啟動以及復位后則進入該狀態。空閑狀態由硬件層面的總控模塊進行控制處理。模塊對系統的所有控制信號進行復位操作。系統在FPGA時鐘上升沿時檢查是否有外部(如開關、按鈕等)電平為高的運行信號(START)。在系統獲得高電平啟動信號之后開始進行狀態的轉換(以下模塊轉換中如無特殊說明,均是高電平有效),否則一直在IDLE狀態循環等待處于空閑。系統開始運行之后即轉入初始化狀態(INIT)。
●INIT:初始化狀態。在初始化狀態中完成系統中的初始化操作。具體操作為總控模塊發送啟動信號通知初始化模塊開始工作。之后在該狀態等待初始化操作的完成。在收到初始化模塊的完成信號之后,進入CROSS狀態。
●CROSS:雜交狀態。在雜交狀態中完成系統中的雜交操作。具體操作為總控模塊發送啟動信號通知雜交選擇模塊開始工作。之后在該狀態等待雜交操作的完成。在收到雜交模塊的完成信號之后,進入MUT狀態。
●MUT:變異狀態。在變異狀態中完本系統中的變異操作。具體操作為總控模塊發送啟動信號通知變異選擇模塊開始工作。之后在該狀態等待變異操作完成。在收到變異模塊的完成信號之后,進入VALUE狀態。
●VALUE:評估狀態。在評估狀態中完成本系統中的評估和停機判斷工作。具體操作為總控模塊發送啟動信號通知評價模塊開發工作。之后在該狀態中等待評價操作完成。直到收到評價模塊的完成信號之后,模塊根據反饋信號的不同決定下一個狀態。當STOP信號為0時,系統轉入CROSS狀態進行下一代遺傳操作。當STOP信號為1時,系統轉入STOP狀態。
●STOP:停機狀態。在停機狀態中完成本系統停止過程中的相關操作。具體操作就是模塊將算法獲得的最優個體及其適應值進行輸出操作,即將個體、適應值、運行代數、運行周期從模塊的輸出端口輸出,軟件層面獲取輸出數據之后將其反饋給用戶。最后再將整個設備狀態轉入IDLE狀態,并且重置片上內存。
(1)隨機數模塊
隨機數模塊由軟件端實現。該模塊提供了遺傳算法流程中初始化模塊中個體生成、雜交選擇模塊的個體選擇和雜交點選擇、變異選擇模塊的個體選擇和變異點選擇。該模塊采用Xilinx公司擴展的C語言實現。具體實現表現為一個函數。函數有一個控制參數。函數返回為所需求的隨機數值。軟硬件交互協議的部分由調用該函數的部分控制實現。函數的內部具體實現為根據控制參數來判斷硬件所需的隨機數的范圍。函數實現為調用C語言中自帶的rand()函數,通過取模操作來選擇隨機數范圍。雖然C語言rand函數實現同樣可以使用硬件實現,但是在軟件實現的rand函數的隨機數種子是根據系統時間獲得,而硬件實現的隨機數的種子在每次產生隨機數時是固定不變的。
(2)適應值評價模塊
適應值評價模塊由軟件端實現。該模塊的功能為完成遺傳算法整個流程中的適應值評估工作,也就是所需要解決問題的具體描述。該模塊采用Xilinx公司擴展的C語言實現。具體實現表現為一個函數。函數的參數為控制參數以及需要進行適應值評價的個體(具體表現為一個50維數組)。函數返回為該個體的適應值。軟硬件交互協議的部分由調用該函數的部分控制實現。函數的內部具體實現為針對所求問題對二進制編碼形式的個體進行相應的計算。由于軟硬件交互時使用的是IP核內置寄存器,寄存器大小為32位。每個個體使用兩個寄存器,第一個寄存器32位全部使用,第二個寄存器只使用前18位。所以從寄存器中獲得個體計算適應值前,必須對寄存器中的數據進行處理。本設計中使用split函數進行該操作,輸入為兩個int類型,輸入為50維數組。函數通過移位和與操作完成。
在科學研究中,數值計算是一類經常遇到的問題,通常這類問題的復雜度較高,使用普通的算法計算時間較長。使用遺傳算法解決數值問題可以起到較好的效果。但是軟件實現的遺傳算法執行效率低下,所以可以使用軟硬件協同工作的方式在不改變算法通用性的基礎上加快算法的收斂速度。
二進制問題是一類可以有效驗證遺傳算法功能正確性的基本問題。設計中使用的問題為計算二進制串中“1”的個數。1的個數越多,效果最優。由于初始化個體為隨機初始化。所以在初始化個體中0與1的比例接近1:1,必須通過不斷的雜交和變異才可以獲得最優解。因為個體串長為50,所以最優解為50個1。使用軟硬件協同的遺傳算法解決該問題只需要改寫軟件端的適應值函數。無需對硬件進行修改。
二進制問題運行效果見圖4所示。

圖4 二進制問題運行效果圖
從圖4中我們可以看出算法可以正確找到最優解,運行的代數為1272,去除用于判斷終止條件的500代,算法共運行700多代。整個算法運行時間為4.2秒。
因為遺傳算法是一個隨機搜索算法,算法的性能受初始化種群的好壞以及雜交變異的隨機性影響較大。而以上實驗截圖均是試驗中隨機獲取的數據,并不能代表設計的性能以及效果。
為了對軟硬件協同遺傳算法平臺的性能進行分析。本設計還利用開發板上PowerPC實現了一種純軟件實現的遺傳算法。為了驗證本設計的性能,這種實現方式的遺傳算法在流程和遺傳算子上設計都是和本設計完全一致的。為了避免由于隨機數帶來的偶然性誤差,本實驗得到大量數據之后,再對數據平均進行數據統計。其中二進制問題的對比數據如表1所示。

表1 兩種不同環境下算法運行效率對比
從表1中我們可以看到,本設計實現的算法和其他方式實現的算法都可以獲得最優解,并且收斂速度基本一致。本設計相比軟件實現性能卻有了10倍的提高。我們可以得出結論,使用軟硬件協同方式的遺傳算法在保留了軟件的可移植性的基礎上還可以提升數倍的運行效率。
本文介紹了算法平臺設計中的軟硬件劃分的依據、軟硬件劃分的結果以及設計中模塊之間的連接關系。隨后對設計中的各個硬件模塊的具體實現做了詳細的介紹。設計了軟硬件之間進行信息交互所需要的協議,最后分別介紹了將硬件化模塊整合成整體遺傳算法IP核、FPGA開發平臺搭建、軟件平臺搭建、整個系統整合。該方法具有軟件的通用性以及硬件的運算高效性,理論上使用到遺傳算法的地方均可以使用該方法提高運行效率,尤其適合在實時性要求較高的場合(例如工業控制)應用。