6.1 結論
整篇論文是以 MPEG-4 的視訊解碼如何運作在多核心系統上為研究重心,二、三 章深入討論多核心處理器的軟體架構以及視訊壓縮演算法的解碼流程,並在第四章說明 如何實現多核心程式的運作來縮短解碼時間。
第二章介紹 PS3 中的多核心軟體架構,內容包含 SPE 程式的建立、核心間的資 料傳輸以及通訊機制的使用方法等,研究內容主要著重在軟體的使用流程,並藉由所遭 遇到的問題了解多核心的運作流程。第三章為分析 MPEG-4 的視訊解碼流程,說明解 I、P、B 畫面時,如何一一解出畫面中的各個 MB,以重建出原本的整張畫面,並藉由 剖析流程找出可平行化的運算部分。
熟知 MPEG-4 的解碼原理後,將可平行運算的解碼步驟移至 SPE 上協同運算,
而關於如何移至 SPE 上便在第四章作詳細的說明。當部份解碼步驟改在 SPE 上執行 時,利用這些節省下來的時間,讓 PPE 端可以繼續下一步的解碼作業,簡單來說,就 是運用副核心來協助主核心來進行解碼,經由第五章的實驗數據可知,多核心運作確實 將每張畫面的解碼時間縮短約十分之一。
6.2 未來發展
在第五章實驗可觀察到,當 SPE 協助平行解碼時,確實縮短了解碼時間,不過為 了讓效能達到最佳化,仍有幾個可以改善的地方:
將移動補償時的內插運算加到 SPE 上進行運算
若能解決 4.3.2 之記憶體不足的問題,將解碼時間比例較多的解碼元件移至 SPE 上執行,應該可以大幅縮短解碼時間,達到更好的效能。
讓每個 SPE 的解碼內容達到 Load Balance
Porting 解碼元件時,將各個解碼元件所佔的運算時間比例,平均落在各顆 SPE 上,簡言之,就是讓每個 SPE 的工作量相當。
使用大量的資料傳輸時,配合雙重緩衝技術
當移動補償時的內插運算在 SPE 上執行時,便需要在主記憶體和區域記憶體之間 作大量的資料傳輸,為了降低資料傳輸所造成的延遲,SPE 在傳遞資料應配合雙重緩衝 技術來達到最佳效率。雙重緩衝技術如 2.3.3 中提及的,此技術可在 SPE 上發揮計算 與傳輸平行化的優點。
參考文獻
[1] 林海波 謝海波 邵凌 王運洪 等編著, Cell BE 處理器編成指南, 電子工業出版社, 97 年 7 月
[2] Iain E. G. Richardson , H.264 and MPEG-4 VIDEO COMPRESSION , John Wiley &
Sons , December 2003
[3] http://www.kernel.org/pub/linux/kernel/people/geoff/cell/ps3-linux-docs/ps3-linux- docs-08.06.09/CellProgrammingPrimer.html
[4] D. A. Bader and S. Patel, "High performance MPEG-2 software decoder on the cell broadband engine," in Parallel and Distributed Processing, 2008. IPDPS 2008. IEEE International Symposium on, 2008, pp. 1-10.
[5] http://publib.boulder.ibm.com/infocenter/systems/scope/syssw/index.jsp?topic=/eiccc/
eiccckickoff.html&Open&S_TACT=105AGX16&S_CMP=LP [6] http://book.51cto.com/art/200902/111495.htm
[7] http://twins.ee.nctu.edu.tw/courses/soclab_04/lab_hw_pdf/proj1_jpeg_introduction.pdf [8] http://www.xvid.org/
[9] 笠野英松 著, MPEG-4 最新動態影像壓縮標準、引領數位視訊全方位運用, 李于青 譯, 博碩文化股份有限公司, 2001 年 6 月
[10]Cell broadband engine programming tutorial, IBM ,version 2.1, 2007
[11] Cell Broadband Engine Programming Handbook, IBM, version 1.11, May 2008
[12] Cell broadband engine SDK libraries overview and users guide, IBM, version 2.1, 2007 [13] SPE runtime management library, IBM, version 2.1, 2007
[14] C/C++ language extensions for Cell Broadband Engine architecture, IBM, version 2.4, 2007
[15] Cell Broadband Engine architecture, IBM ,version 1.01, 2006
附錄一:實驗環境的建立
我們在編譯 Xvid Codec 的 Open Source 時,會在 Linux 系統之下將所有的程式碼 都編譯成object 檔,接著再將 object 檔合併成靜態 (Static) 連結檔及動態 (Dynamic) 連 結檔,靜態連結檔為 libxxx.a 而動態連結檔則為 libxxx.so,最後將 Xvid 的標頭檔 (Header) 以及剛剛所生成的動態及靜態連結檔,放至 Linux 讀取 Codec 的路徑下,詳 細的步驟如下:
1. 至 http://www.xvid.org/ 下載 Xvid Codec 的原始碼,這邊使用 1.2.1 版 2. 到 /xvidcore-1.2.1/build/generic/ 下依序輸入
# make
# make install
連結檔建立好之後,接著在原始碼中有一個解碼的程式範例,其用途是讀入 MPEG-4 壓縮格式的影片,透過上述建立好的靜態及動態連結檔來進行解碼,最後會得到I420 (即 4Y1U1V) 的圖像資料,將一張張的 frame 輸出成 tga 或 pgm 的圖片格式,但是,我們 需要的輸出方式是連續的影像輸出,而不是以寫成圖片的方式輸出,所以我們自行在程 式範例中添加了一個功能,這功能可以解好的I420 圖像資料,依照整張 frame 的 y、u、
v 畫面順序,以 pipe 的方式輸出,所添加的 fifo 功能之程式碼內容如下圖所示。
3. 添加完程式碼後,便到 /xvidcore-1.2.1/examples/ 下依序輸入
# make all
# ./xvid_decraw –i /opt/testfile/short.avi –fifo
第二條指令的 /opt/testfile/short/avi 為影片檔案的所在路徑
#include <fcntl.h>
位於 /xvidcore-1.2.1/examples/ 路徑下
#define DATA_OUT “fifo”
static int write_out(unsigned char *image){
int ret ,fd ;
ret = mkfifo(DATA_OUT,0666);
fd = open(DATA_OUT , O_WRONLY);
write(fd , image , XDIM*YDIM + XDIM*YDIM/2 );
return 0;
}
最後然後開啟mplayer 去接收,並設定好長寬、每秒播出的張數,就可以成功秀出 影片,關於 Mplayer 於 Linux 下的安裝方式,會在下一個附錄作說明。
4. 其中 Mplayer 安裝的所在位置在 /usr/local/mplayer/bin,所以至路徑下輸入
# ./mplayer /xvidcore-1.2.1/examples/fifo –demuxer rawvideo –rawvideo w=640:h=360 –fps 25
pipe 是處理 process 之間的大量資料傳輸,它是將一個 process 與另一個 process 連接起來的一種方式,其用途就是使 pipe 前面 process 之標準輸出導引至 pipe 後面 process 之標準輸入,換句話說,Xvid 的解碼範例之標準輸出為 y、u、v 畫面的順序,
而 mplayer 之標準輸入就是 rawvideo 影片格式。
附錄二:Mplayer 的安裝
自行自網站下載 MPlayer-1.0rc2.tar 的壓縮檔,接著依序輸入
# tar -jxvf MPlayer-1.0rc2.tar
# cd MPlayer-1.0rc2
# ./configure --prefix=/usr/local/mplayer --cc=gcc34 (or --cc=gcc4)
# make
# make install