當前位置:
首頁 > 科技 > 「技術文章」當您的嵌入式處理器失去動力時,請嘗試並行

「技術文章」當您的嵌入式處理器失去動力時,請嘗試並行

下面的場景越來越常見了。您有一個正在工作的嵌入式設計,在客戶那裡已經部署了多年,成百上千行的調試代碼為其提供支持。市場上隨之而來的是一組性能新規範,採用需要大量計算的演算法進行研發。您現有的CPU系列無法對此進行處理。

在這一點,您的選擇不是那麼樂觀。您可能會選擇性能更高一些的CPU系列,不會完全損失指令集兼容性。但是新操作系統(OS)版本和代碼重新驗證幾乎一定會帶來問題。新CPU會有新的硬體相關問題,從更大的功耗直至不同的DRAM介面。

當然,您也可以轉到具有不同指令集的更快的CPU。但是新工具鏈,從編譯器到調試,以及找到所有這些隱藏指令集的任務取決於您的已有代碼,這種轉換可能會非常困難。改變SoC供應商也會有系統級硬體相關問題。

或者您可以嘗試不同的方法:找到代碼中或者新演算法中的性能熱點,將其分成能夠並行執行的多個線程。然後,您可以在多核CPU群中執行新代碼。除非您目前使用非常獨特的東西,那麼總是有很好的機會使用有多個CPU內核例化的晶元。或者,您的數據本質上是並行的,您可以重新編寫這些線程,在圖形處理器(GPU)、多核數字信號處理(DSP)晶元,或者FPGA和ASIC中的專用硬體加速器上運行。所有這些選擇都需要新代碼——但是只針對您所加速的某些代碼段。大部分已有代碼可以保持不變。

實現並行

如果您決定採用並行路線,接下來最明顯的問題就是怎樣實現它。正如您所預計的,答案取決於您的代碼以及所選硬體的並行特性。

總是有手動方法。如果您打算研究如何實現任務的並行。例如,帶來麻煩的需求是最大延時規範,常式中最差情況通路上有太多的指令。如果在多核配置中您有N個CPU,您可以將關鍵常式分成N個獨立線程,在每一個CPU內核上並行運行。您可能會思考執行一些線程,這樣大部分線程不需要等待其他地方的計算結果。

採用多核感知操作系統,您可以將每一線程與不同的內核相關聯,同時啟動它們,減小最慢線程的任務延時,稍有一些開銷。如果幸運的話,能夠提高近1/N。當然,您負責找到線程避免共享存儲器或者I/O帶來的衝突問題。如果改變了演算法或者硬體,您可能不得不重新開始。

另一手動機會來自硬體加速器。如果您使用GPU,可以通過它來探查數據的並行處理。您需要在供應商開發的GPU語言中對任務重新編碼,例如Nvidia的CUDA。相似的,如果您採用FPGA來加速任務,會使用Verilog或者VHDL描述所需的狀態機和數據通路來進行加速計算。在GPU和FPGA這兩種情況下,有翻譯至少能夠幫助您將C/C++轉換成所需的硬體專用語言,您利用這些語言開始工作。但是在這一過程的前端和後端仍然有手動步驟。

這裡對自動處理的需求非常明顯:能夠處理您代碼的工具,對比通路和時序約束,找到可以並行的熱點,將其轉換為目標硬體中的代碼。還沒有這類工具。但是有兩種工具,都是在嵌入式計算環境之外開發的,能夠完成大部分這類工作。

OpenXX

其他領域在進行嵌入式計算之前就遇到了並行處理難題。例如,在高性能計算中,從早期Cray機等大量的單線程處理器到小規模的多核處理器陣列等,都要求程序員重新編碼。他們不得不從具有大量本地參考的巨大的線程轉到能夠在不同內核上運行的半獨立線程。由於真正的大規模工作通常會轉到最先面市的超級計算機上,程序員希望能夠有一種與機器無關的方式來完成這類工作的工作台。對此最成功的答案之一是OpenMP。

由於其傳承性,OpenMP被認為能夠幫助編程人員在同構、共享存儲器多處理環境中應用代碼(圖1)。最近擴展到採用加速器以及多核群來一起工作,但仍然是基於共享存儲器。理想情況下,在OpenMP中應用代碼後,會在有OpenMP平台的任何系統中正確的執行,而性能會有很大的不同。

圖1.OpenMP建立在共享存儲器多處理模型基礎上。

「技術文章」當您的嵌入式處理器失去動力時,請嘗試並行

OpenMP通過讀取注釋——您在C或者FORTRAN中的注釋,在代碼中建立並行區,在這些區域中分開多個線程,將線程分配給單獨的處理器。您通過注釋標記並行區的開始(在FORTRAN中)和結束。然後——接下來是對很多的功能進行極大的簡化,您可以從兩個不同的模型中進行選擇。您可以告訴OpenMP,閉環代碼是for循環(或者DO循環,如果您是FORTRAN程序員),OpenMP應解開循環,提取出能夠並行執行的線程。這是您進行數據並行處理常用的方法。或者,您可以告訴OpenMP,代碼含有一些獨立部分——每一部分以更多的注釋進行標記,可以在單獨的處理器中執行。這是任務並行的方法。

OpenMP平台根據您在注釋中放置的指令、可用硬體以及運行時變數,將您找到的線程分配給處理器。這樣,您可以實現從純粹的任務靜態映射到處理器直至全動態系統的所有工作。如果您告訴OpenMP恢復正常工作,您最初的程序會以最初的形式運行,一個CPU上的一個線程。如果您讓OpenMP使用更多的CPU,它會嘗試按照您要求的方式來進行。其他的指令控制線程的同步,變數的控制和使用,以及並行編程所必須的其他工作。

注意,OpenMP處理結構,而不是方法。完全由您來決定哪些任務應並行處理,怎樣防止出現衝突問題,怎樣避免死鎖,等等。OpenMP不設定任務間通信模型,也不提供調試環境——您可以自由的選擇自己的。OpenMP基本上位於您現有工具鏈和OS的頂層——儘管有一些工作是建立裸金屬OpenMP平台。

OpenCL簡介

在超級計算環境下從OpenMP工作中分離出來,蘋果計算機的一個團隊多年前以完全不同的方式開始研究同樣的難題——並行代碼。不是採用共享公共虛擬存儲器的多個同樣內核的系統來工作,蘋果團隊關注的是較小的不對稱體系結構中的數據並行問題,一個CPU連接了多個硬體加速器。即,他們關注個人計算機。Intel、Nvidia和AMD——都採用了CPU+GPU SoC,很快在這方面進行了投入。他們的結果是開放計算語言(OpenCL)。

與OpenMP相似,OpenCL為並行提供了平台。與最初的OpenMP不同,OpenCL看到了異構環境,每一個處理器使用本地存儲器中定義清楚的底層存儲器(圖2)。與OpenMP不同,OpenCL要求將您的部分C代碼轉換為擴展子集。(對不起,FORTRAN程序員。)為避免重新編寫更嚴格的語言,OpenCL?平台將您代碼的並行部分轉譯成能夠在所支持的加速器硬體中執行的代碼。目前,這包括某些GPU、多核DSP SoC、FPGA、固定功能加速器,例如,視頻處理器,或者同時使用這些器件。

圖2.OpenCL模型假設具有本地存儲器的異構系統。

「技術文章」當您的嵌入式處理器失去動力時,請嘗試並行

OpenCL開發流程與OpenMP的開發流程完全不同。並不是通過注釋對程序標註,而是開發一組程序。主程序——相當於OpenMP中的主線程,您採用C/C++、Python、Java,或者大家不太知道的語言進行編寫。在很多情況下,通過應用程序介面(API)調用替代某些程序段能夠簡化您已有的程序。您正常編譯主程序,以及OpenCL API庫,在您的主CPU上執行。(注意,OpenCL是面向主CPU和協處理器,即使是能夠用在同構多核硬體中。)

您希望加速的代碼部分——在OpenMP中通過注釋標記的部分,採用OpenCL的C語言,作為單獨的小程序而重新編寫。這些小程序被稱為核。您的主程序會通過您在前面段落中插入的OpenCL API調用來激活它們。

在運行時,OpenCL平台尋找哪些硬體實際上適用於它。如果沒有可用的加速器,核會使用主CPU (如果是Intel或者AMD體系結構),就像有加速器,因此,您實際上得到了最初的單線程程序。

如果有其他的硬體,OpenCL會編譯核,對其進行探查。這可能會包括解開循環,或者分解矢量操作,將結果線程分到多個CPU內核上,或者GPU中的很多小處理器上。或者會將核的輸入數據與SoC或者FPGA中的固定功能加速器相綁定。當您運行主程序時,會激活核,從而在加速器上執行。

FPGA呈現了一個有趣的特殊案例,面向FPGA的OpenCL工具能夠將核編譯到Verilog中,在運行之前,為FPGA離線綜合硬體加速器。然後,OpenCL驅動會在運行時把加速器裝載到FPGA中。通過建立定製硬體,您通常可以避免指令獲取和解碼工作,不需要內部數據移動,找到傳統CPU無法完成的精細粒度並行操作。

最初發布的OpenCL附加了很多規範,包括更多的數據類型,更靈活的存儲器組織,能夠將較大的GPU或者FPGA等器件分成幾個不同的加速器,增加管道,程序可以不使用緩衝,將數據從輸入直接送入加速器。

做出決定

那麼如何選擇呢:手動並行,OpenMP,還是OpenCL?(是的,有其他的,有不太公開的選擇。)當然,第一個問題,哪一種平台適用於您所考慮的硬體。有為大部分多核SoC提供的多核OS——儘管並不是所有的都支持非對稱多處理。手動操作通常是可行的,不需要建立自己的裸機RTOS。

OpenMP如果能夠提供一個簡單的編程模型,可以說是任務並行或者同構多核SoC的最佳解決方案。但它只是從超級計算移植到嵌入式環境中。看起來德州儀器的Keystone ARM?加多核DSP SoC有供應商支持。這令人聯想到,2月份ARM加入了OpenMP體系結構檢查委員會,使得嵌入式巨頭在平台方面有發言權。這些事實更清楚的展示了這些公司在伺服器和嵌入式計算髮展方面的策略。

OpenCL的數據並行加速與異構系統非常貼近,很快便融入到嵌入式環境中。某些SoC結合CPU和GPU,某些DSP SoC,以及某些FPGA提供OpenCL平台。越來越多的公司為這些晶元提供封裝,提供全包OpenCL環境支持。

這些解決方案都沒有為已有代碼提供自動並行處理支持。整個行業仍然採用多處理系統的高效調試方法。沒有人說平台使得設計容易了。但一種出路是——需求超出了您目前體系結構的發展,轉到並行要比把大量的已有代碼改成新指令集體系結構容易得多,而且風險也小得多。最終性能會非常好,能耗也低很多。值得了解一下。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 電子創新設計 的精彩文章:

西部數據推出X4 3D NAND技術,進一步強化其在X4 2D NAND技術多級單元存儲領域 業界領導地位
初學嵌入式開發ARM的學習方法

TAG:電子創新設計 |

您可能感興趣

有核動力艦船,為何沒有核動力飛行器?飛行器實現核動力談何容易
修補錯誤的行動力,才是最好的辯解
做事,要的不是行動力,而是必須行動的理由
真正的修行要找到動力
核動力航母無法擊沉?俄專家:理論上有兩款武器可以,但不敢嘗試
為什麼無法實現核動力火箭的應用呢?因為沒有合格的推進方式
我國的核動力破冰船技術能否用於核動力航母
為何核動力航母如此被推崇?對比完常規動力,都明白了
行書——書法發展之動力
核動力如此好為什麼現代軍艦不採用核動力?性能雖好,卻不實惠
中國航母的動力之爭:核動力不一定更好 常規動力可能更合適
手提式動力鋸的結構及原理
不需任何動力 這款軟體機器人就能爬行
普京宣布成功試射核動力導彈 射程無限可隨意調轉
核動力導彈行不通?這才是俄軍信賴的最新武器,反導系統無法攔截
需求牽引與技術驅動—美軍裝備採辦動力機制及其管理改革
航空母艦都用核動力,為什麼驅逐艦不用核動力呢
全球最瘋狂的導彈:採用核動力發動機 理論上射程無限遠
普京宣布俄成功試射核動力導彈 射程無限可隨意調轉
詳細組裝步驟:風能動力機械獸