開源硬體Beaglebone® Black只需10秒啟動Linux作業系統,兼具低成本、開源等特點,BeagleBoard.org®基金會已經就圖形開發學習與Imagination公司展開合作,使得該開源硬體成為學生教學和基礎OpenGL ES2.0學習的理想平臺(OpenGL ES是OpenGL三維圖形API子集,針對手機和遊戲主機等嵌入式裝置而設計),而以往要在標準計算機上進行此類開發和學習。
Beaglebone® Black板載主處理器採用Arm® Cortex® A8核心,雖然使用舊的PowerVR SGX 530圖形處理單元(GPU),但對於教育應用來說,可利用標準OpenGL® ES 2.0和OpenCL 1.1 API增強應用功能。(OpenCL是一個為異構平臺編寫程式的框架,此異構平臺可由CPU、GPU或其他型別的處理器組成。)
Beaglebone® Black▲
新發布的OpenCL軟體庫和文件支援Beaglebone® Black。在不要求高效能的前提下,學生或者初學者能夠以較低成本學習如何在Beaglebone® Black上程式設計。某些應用對延遲要求不高,A8核心負荷降低有利於大量訊號處理任務。例如,軟體庫中包括ALSA取樣率轉換器,在延遲要求不高的情況下,可將A8的負荷從55%降低到20%。藉助於該軟體庫和Beaglebone®社群的力量,相信OpenCL會發揚光大。
SGX530支援OpenCL嗎?
PowerVR SGX530是Imagination公司較成功的GPU設計之一,至今仍廣泛使用。但是,PowerVR SGX530已經具有十年曆史,其關鍵設計工作是在OpenCL成為標準之前進行的。不過,Imagination致力於在PowerVR SGX530上提供OpenCL 1.1支援,Beaglebone® Black取得了巨大成功之後,Imagination更是將這項工作持續進行下去。軟體包中的SGX530 OpenCL二進位制檔案仍在開發中,這些二進位制檔案尚未完全滿足OpenCL 1.1一致性要求。
使用OpenGL ES2.0
Beaglebone® Black系統映象預裝TI SGX圖形驅動程式和PowerVR SDK,這些是OpenGL和OpenCL開發的基礎。PowerVR SDK提供一些示例——從繪製三角形作為最基本的圖形元素開始(圖1),直到使用頂點和片段著色器獲得更復雜的影象(圖2),這些示例可用於自學目標,或者將Beaglebone® Black用作移動圖形入門課程的開發平臺。
圖1:基本三角形▲
圖2:新增頂點和片段著色器▲
理解OpenCL 1.1
可以從這裡下載OpenCL軟體包,其中包含一個構建指令碼,將安裝OpenCL軟體庫並修補PowerVR SDK,僅允許為Beaglebone® Black構建OpenCL 1.1矩陣示例。
OpenCL矩陣乘法(Matrix Multiplication)示例用於教育目的,以瞭解OpenCL如何在Beaglebone® Black等嵌入式平臺上執行。要了解的關鍵點是在Arm A8和PowerVR SGX 530核心之間傳遞資料緩衝區,以及管理它們之間的資料的快取一致性時所隱含的開銷(overhead)。在此開銷時間內,無法完成任何處理工作,因此可以將其視為被浪費的時間。Beaglebone® Black上的OpenCL在下列情況特別有用:圖3所示處理時間與開銷相比,因為這是在SGX處理任務時釋放A8核心以執行其他任務。
圖3:OpenCL開銷和處理時間▲
這裡使用幾個OpenCL核心說明如何在float4型別(四個32位資料值的資料包)上使用單指令多資料(SIMD)指令提高SGX處理效能。必須注意的是,如果目標是縮短Beaglebone® Black處理時間,最佳解決方案是使用Arm® NEON intrinsic指令,因為其沒有開銷。
使用OpenCL 1.1
矩陣乘法示例對於理解OpenCL很有用。下一步是在具有高處理能力和延遲要求不高的示例中使用OpenCL,例如音訊播放器應用中使用的ALSA取樣率轉換器(SRC)。較高的處理要求來自44.1kHz至48kHz取樣,而播放器可以放寬延遲要求。OpenCL實現適合於如圖4所示的ALSA軟體,libspeexdsp層已修改為呼叫OpenCL。
圖4:ALSA軟體體系結構▲
下載ALSA軟體包,執行指令碼來構建此示例。OpenCL軟體庫作為C++軟體庫,因此ALSA需要使用g++進行編譯,確保正確呼叫OpenCL建構函式/解構函式。g ++編譯器比GCC嚴格,大多數補丁程式是為了糾正指標型別轉換,並確保已初始化結構以正確順序被完全初始化。
為了利用OpenCL,演算法必須是完全可並行的,並且對每個輸出樣本執行相同操作。libspeexdsp中的SRC演算法實際上並不執行此操作,因為內部迴圈會計算外部迴圈的下一次迭代中使用的索引值,這就需要對ALSA SRC演算法進行重構,以便可以將索引計算步驟從處理迴圈中取出並首先實施,以使每次迭代的處理迴圈都相同。
由於aplay只是一個播放的應用,等待時間要求不高。事實證明這是必要的,因為處理160個樣本的標準輸入音訊緩衝區大小的開銷,阻止實時執行OpenCL呼叫。640個或更多樣本的緩衝區大小可實現可靠的操作。當在A8上實施SRC時,具有1600個樣本緩衝區的A8負載從55%降低到了20%。CPU計算負荷降低,這是在Beaglebone® Black上使用OpenCL帶來的收益。希望社群開發者能夠找到其他使用案例,提高Beaglebone® Black系統的效能。OpenCL下載包中的文件更加詳細,幫助讀者理解OpenCL操作並能夠有效地使用它。