• 沒有找到結果。

The Optimal Design for Motion Estimation Algorithm on Cell Processor Architecture

N/A
N/A
Protected

Academic year: 2021

Share "The Optimal Design for Motion Estimation Algorithm on Cell Processor Architecture"

Copied!
12
0
0

加載中.... (立即查看全文)

全文

(1)

動作估測演算法在 Cell 處理器架構上之

最佳化設計

The Optimal Design for Motion Estimation Algorithm on Cell Processor Architecture

Jih-Ching Chiu (邱日清) Ta-Li Yeh (葉大立) Cheng-Han Liu (劉政翰)

Department of Electrical Engineering, National Sun Yat-Sen University, Kaohsiung,804, Taiwan

Email:chiujihc@ee.nsysu.edu.tw; d973010017@student.nsysu.edu.tw; m963010026@student.nsysu.edu.tw

摘要―視訊資料編碼是視訊傳輸技術中相當重要的

一環,而動作估測演算法是資料編碼過程中一個重要的動 作。若能以平行化的方式進行動作估測演算法的運算將可 縮短資料編碼的時間。

本論文將會針對 Three-Step Search 以及 Diamond Search 兩種動作估測演算法進行最佳化。實現的方式是

根據Cell 處理器的特性,設計出 multiple buffering 的

DMA (Direct Memory Access) 資料存取機制、以向量計

算取代原本的純量運算與以減少branch 指令數的方式來

避免branch miss 造成的 penalty,加上設計適切的資料

分割排程方式來對動作估測演算法加速,期望在多核心的 環境下設計出最佳的演算法架構。依據以上的加速機制, 我們設計出的動作估測演算法在使用CIF 大小影像並且

使用五張參考影像的情況下實驗結果可以達到每張影像

13.26ms 的處理速度。

ABSTRACT―Motion estimation algorithm is an important part of video transmission technology. If we can parallelize the calculation, the efficiency of will be raised.

In this paper, we will optimize the Three-Step Search and the Diamond Search. The best way to optimize the algorithm is based on characteristics of Cell processor, the design of multiple buffering of DMA (Direct Memory Access) mechanisms and using vector SIMD computer mechanism to replace the original scalar computing mechanism and to reduce the number of branch instructions to avoid causing the penalty due to

branch miss. Based on the acceleration of the above mechanism, we design algorithms for motion estimation in the use of CIF image size and the use of reference images of five cases the experimental results can be achieved for each image processing speed of 13.26ms.

關鍵詞―動作估測演算法﹐Cell 處理器﹐平行化運算﹐

最佳化

Key Word―Motion Estimation﹐Cell processor﹐ parallelize calculation﹐optimize

一、簡介

由於當前網路的發展以及視訊傳輸技術的 演進,網路多媒體的應用已經是不可或缺的一 個部份。而多媒體的應用幾乎都需要高資料流 量的計算,在高資料流的情況下,如何提高多 媒體應用的效能是一個相當重要的課題。 以多媒體應用中的視訊編解碼來說,動作 估測(Motion Estimation)演算法是相當重要一個 動作,它可以將原本的連續的影像重複的部份 抽出並以一個移動向量來代替。這種動作的運 算量相當的龐大,所以如何找出一個對動作估 測演算法最佳化的方法就顯的十分重要。故本 論文希望在多核心系統如 Cell 上以多核心平行 運算的方式設計最佳化的動作估測演算法。

(2)

二、相關研究

在對 Motion Estimation 做最佳化前,首先 會介紹用來實現演算法的處理器架構 Cell B.E. [1][2][3][4][5][6] ,選擇 Cell B.E.的原因是 Cell B.E. 具有高傳輸量的匯流排,可以快速的將資 料傳給各協同處理器 (SPE) 計算,此外不管是 虛擬平台 (IBM Cell B.E. SDK) ,或是實體平台 (SONY PlayStaion®3) 都很容易取得,所以決定 採用 Cell B.E.平台來實現動作估測演算法的最 佳化;然後決定使用的演算法,我們所選擇的 演算法是 Three-Step Search [7][8] ,以及 Diamond Search [9][10][11] ,會選用這兩個以算 法是因為 Three-Step Search 演算法中計算量是 固定的,而 Diamond Search 的計算量則會視運 算的影像不同而有差別,如果我們的最佳化設 計在兩者上都可以得到明顯的加速,就可以證 明我們的設計是有效的,而不是針對特定演算 法進行最佳化;最後再介紹目前相關研究在 Cell B.E. 上所使用加速方法 [12][13][14][15][16][17],例如:以多顆 SPE 平 行計算、以 SIMD 指令取代純量指令的計算、 減少 branch 指令數及使用 Multiple Buffering 等。 (一) Cell B.E. 處理器架構

Cell B.E. (Cell Broadband Engine) 處理器 是由 Sony, Toshiba 和 IBM 三家公司於 2001 年 開始共同研發的新一代處理器。

Cell 的硬體架構上的特點,是它具有一個或 多 個 主 要 處 理 器 PPE (PowerPC Processing Element) 以及數顆具完整功能的協同處理器 SPE (Synergistic Processing Element) ,可以用來 進行高平行度的運算,並且用 1 條高資料頻寬 的 circular data bus 來連接 PPE、SPE 與 I/O 裝 置,稱為 EIB (Element Interconnect Bus) ,為了 使每個處理器都可以存取 Cell 的主記憶體與外 部儲存裝置,所以在每個 SPE 上都有 DMA engine ; CBEA (Cell Broadband Engine

Architecture) 架構如圖 1.;主要是由一顆 PPU 與八顆 SPU 所組成,PPU 與 SPU 的時脈皆為 3.2GHz , 除 此 之 外 , 此 架 構 還 有 一 個 MIC (Memory Interface Controller) 支 援 Dual XDRTM 連接到記憶體,以及一個 BIC (Bus Interface Controller) ,BIC 具有兩組對外通道, 可支援兩組 FlexIO™的匯流排 IO,然後將這些元 件掛在 EIB 上,在這個架構下,EIB 可達到的最 高傳輸速度為 96bytes/cycle (共有 12 組連接數 (PPU 一組,八顆 SPU 各一組,MFC 一組,BIC 上有兩組) ,每組連接都可以一次傳輸 16 個 byte,每次傳輸需 2cycle) ,這樣龐大的資料傳 輸量就可以拿來進行多資料流的平性化運算, 以提升運算效能。 SPE MFC LS SXU SPU SPE MFC LS SXU SPU SPE MFC LS SXU SPU SPE MFC LS SXU SPU SPE MFC LS SXU SPU SPE MFC LS SXU SPU SPE MFC LS SXU SPU EIB (96B/cycle) SPE MFC LS SXU SPU PPU L1 L2 PXU MIC (Memory Interface Controller) 16B/cycle 16B/cycle 16B/cycle PPE 16B/cycle 32B/cycle BIC (Bus Interface Controller)

16B/cycle(2x) Dual XDRTM FlexIOTM SPE MFC LS SXU SPU SPE MFC LS SXU SPU SPE MFC LS SXU SPU SPE MFC LS SXU SPU SPE MFC LS SXU SPU SPE MFC LS SXU SPU SPE MFC LS SXU SPU EIB (96B/cycle) SPE MFC LS SXU SPU PPU L1 L2 PXU MIC (Memory Interface Controller) 16B/cycle 16B/cycle 16B/cycle PPE 16B/cycle 32B/cycle BIC (Bus Interface Controller)

16B/cycle(2x) Dual XDRTM FlexIOTM 圖 1. 實際使用的 Cell B.E.架構 (二) Motion Estimation 演算法 Motion Estimation 是計算一張 2D 的影像到 另一張影像之間的移動向量,這個移動向量可 能影響到整張圖像或是某些特定的部份,如宏 區 塊 (macro block) 或 是 任 意 形 狀 的 一 個 區 塊,甚至是一個像素(pixel);與 Motion Estimation 相對的動作就是 Motion Compensation,就是根 據 Motion Estimation 產生出的移動向量以及原 始的影像,合併出新的影像出來。 計算移動向量的方法分為兩大類,有基於 像素的方法”直接法”與基於影像特徵的方法”間 接法”;我們所使用的演算法是直接法,以下就 只討論直接法的部份。 直接法又以計算的方式分成幾種,我們用 的是 Block-matching algorithm,這種演算法的計

(3)

算方式是將目標影像 (current frame) 切成許多 個區塊(block),然後在參考圖 (reference frame) 中找出與目標區塊差異最小的區塊,判定差異 大 小 的 方 式 是 計 算 SAD (Sum of Absolute Differences) ,就是將搜索範圍 (Search Window) 內的各區塊內各像素相減之後取絕對值,然後 再將所有像素算出來的絕對值加總,得到的值 就是 SAD 值,而在參考圖上目標區塊的位置與 SAD 最小值的區塊之間的位移量就是最後的移 動向量。

1. Three-Step Search Algorithm

Three-Step Search 是在 Motion Estimation 演 算 法 中 比 較 常 見 的 , 屬 於 Uniform Search Algorithm,他會在整個搜索範圍內平均的尋找 SAD 最小值的位置,因為它的動作不一定是三 步,所以有時也被稱為 N-Step Search;他的動 作是以位移量 0 的區塊作為中心,動作如圖 2. 第一步會做中心及從中心向 X 軸方向與 Y 軸方 祥延伸出距離 2N 的九個點,然後在這九個點為 頂點的區塊中找出 SAD 的最小值,第二步是從 第一步的最小值那個點再向 X 軸與 Y 軸的方向 延伸出距離 2(N-1)的八個點,比較這八個點為頂 點的區塊及前一次計算出的最小值的區塊的 SAD 值,然後就一直重複這個步驟,直到向外 延伸的距離為 1 個像素才停止,每一步的動作 相當固定,可以減少判斷式的使用以減少 branch 發生的機率,所以我們採用此演算法來進行最 佳化運算。 15 15 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 15 15 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 圖 2. Three-Step Search 示意圖

2. Diamond Search Algorithm

Diamond Search 也 是 常 見 的 Motion Estimation 演算法之ㄧ,與 Three-Step Search 不 同,他是屬於 Center-Based Search Algorithm,

這類演算法的動作特性是從位移 0 的中心點開 始向外擴張出去;他的動作如圖 3.,是由位移 0 的點為中心向外擴張出去的,第一個步驟會做 中心點以及從中心點向外,X 軸與 Y 軸的位移 量和為 2 像素的點共九個點,再以這九個點為 頂點的區塊中找出 SAD 最小值後,會依照得到 SAD 最小值點的位置不同而分成三種情況,分 別是最小值在第一步的九個點所形成的菱形的 邊上、頂點及中心,在邊上的情況會沿著斜邊 向外延伸三個點;在頂點的情況則是會向外延 伸五個點,然後會比較這些延伸出的點為頂點 的區塊的 SAD 值與前一次計算的最小 SAD,找 出這次的最小值;以上這兩種情況做完之後都 會與步驟一相同,根據其 SAD 的最小值位置不 同繼續向外擴張出去,直到第三種情況,也就 是 SAD 的最小值的位置是落在中心或者是在向 外擴張時最小值是落在前一次計算的最小值的 位置,在這種情況下會從 SAD 最小的點向上下 左右移動 1 像素的四個點,然後對這四個點作 最後的一組 SAD 計算,這四個點為頂點的區塊 的 SAD 值與中心的 SAD 值比較後最小值的位 置就是最後的位移量。 第二個演算法會選擇 Diamond Search 的原 因是因為他與 Three-Step Search 分別是屬於不 同類型的 Motion Estimation 演算法,是從中心 開始向外重複的進行擴散,直到找到適合的結 果才會停止,會進行重複的擴散這點就是跟 Three-Step Search 最大的區別。 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1222 2 1 1 1 1 1 1 1 1 1 2 2 2 1 1 1 1 1 1 1 1 1 2 2 2 2 2 (a) (c) (b) 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1222 2 1 1 1 1 1 1 1 1 1222 2 1 1 1 1 1 1 1 1 1 2 2 2 1 1 1 1 1 1 1 1 1 2 2 2 1 1 1 1 1 1 1 1 1 2 2 2 2 2 (a) (c) (b) 圖 3. Diamond Search 示意圖

(4)

(三) Cell B.E.平台上運算加速的方法 在 Cell B.E 平台上要進行運算加速的方法 大概可以分為以下幾類,(1) 以多顆 SPE 同步處 理,進行 thread-level 的平行化處理,(2) 以 SIMD 的向量運算進行 data-level 的平行化處理,(3) 以 減少 branch 指令的方式降低 branch miss 時的 penalty 對 程 式 效 能 的 影 響 , (4) 以 multiple buffering 的方式減少大量資料傳輸時,運算單元 等待資料就緒的時間;以下將分別介紹這些加 速方法的原理。 1. 以多顆 SPE 平行運算來加速 這個方式是在 Cell B.E.平台上最常見的加 速方式,將原本的演算法拆成幾個較小的動 作,在將這些動作分配到 SPE 上做運算,PPE 再把 SPE 算出來的結果做整合或在進行下一步 的運算。 在 [16] 這 篇 文 章 中 , 他 同 樣 是 對 Motion Estimation 做加速,他的 Motion Estimation 是針 對 H.264 的影像壓縮演算法來設計的,所以會從 目標影像往前參考 5 張參考影像,他的作法是 將每張參考影像的移動向量的運算分配給一顆 SPE 來做,這樣的優點就是每一顆 SPE 裡面的 運算較單純,每一顆 SPE 的運算量都一樣,而 PPU 就只需要接收各 SPE 做完的移動向量及最 小 SAD 值,再選出其中 SAD 最小的一組移動 向量就是最後結果。 2. 以 SIMD 的方式進行運算 以 SIMD 方式運算也是相當常見的加速方 式,他是使用 SPE 內建的 SIMD 指令集來進行 運算,以陣列的加法為例,在使用純量的加法 運算時,a 與 b 兩個陣列相加就是陣列 a 的一個 元素跟陣列 b 的一個元素相加,a 與 b 陣列內有 幾個元素就必須經過幾次的加法運算才能算出 最後 c 陣列的結果,而如果使用 SIMD 的方式運 算,就可以直接使用向量的加法指令直接相 加,即可得到結果。 3. Multiple Buffering 除了以上這些加速方式,改善 DMA 的動作 也是可以用來加速的方法之ㄧ,在處理大量資 料時無法讓 DMA 一次就完成資料抓取,而且在 一次抓取大量資料的情況下等待資料抓取的時 間會延遲後面運算的動作,所以就改善 DMA 的 動作如圖 4.,將要抓取的資料分成多份,每抓 完一次資料就發出下一次的 DMA command,把 資料抓到另一個 buffer 裡,並且計算剛剛抓進來 的資料,將等待 DMA 的時間與資料運算的時間 重疊,然後在計算結束之後再發出下一次的 DMA command 並開始計算剛剛抓進來的資 料,重複這個動作直到資料抓取結束,這樣可 以減少整體運算所花的時間,效能增進最大的 情況是抓取資料的時間剛剛好與計算的時間相 等,設定的 buffer 大小就會與效能有明顯的關 係,buffer 太大的話會變成計算結束之後還要等 DMA,buffer 太小的話則是會增加初始化 DMA 動作的次數而造成延遲,而且在 DMA 要抓的資 料越多的時候加速會越明顯。 DMA抓取資料 計算 init 1I 2II 3III 4IV 5 V 不使用multiple buffering 減少的時間 使用multiple buffering DMA抓取資料 計算 時間 時間 DMA抓取資料 計算 init 1I 2II 3III 4IV 5 V 不使用multiple buffering 減少的時間 使用multiple buffering DMA抓取資料 計算 時間 時間 圖 4. multiple buffering 示意圖 4. 減少 branch 的指令數

在介紹 SPE 的時候已經有提到 branch miss 的 20 個 cycle 的 penalty 對 SPE 效能的傷害是很 大的,所以在程式內能夠避免使用多餘的判斷 式就盡可能避免,在”High-Performance Regular Expression Scanning on the Cell/B.E. Processor” 這篇文章中是以 SIMD 的方式來解決判斷式的 問題,他的判斷式是用來決定數筆資料的來 源,他的解決的方式是將兩筆資料各存成向量 變數,而判斷式的選擇訊號也是以 SIMD 的邏 輯運算的方式來產生各元素的選擇訊號,根據 選訊號使用 SIMD 的指令選出需要的資料,這 樣就可以在不使用 branch 的方式完成這個選擇 的動作。

(5)

三、

Cell 平台上動作估測演算法設計

為了使動作估測演算法在 Cell 平台上進行 加速,我們會對動作估測演算法的動作做一些 改善,然後會將我們設計的加速方法實際應 用,然後會以另一個演算法同樣改良並實際應 用這些最佳化的方法,來驗證這種最佳化的方 式是否對其他演算法也通用。

(一) Three-Step Search 在 Cell 平台上的實現 在將動作估測演算法實現之前,首先要設 定相關的參數,我們設定每個區塊 (block) 的大 小為 8x8 個像素,搜索範圍 (search window) 為 15 個像素,由於我們使用的影像是 352x288 像 素的黑白影像,所以每個像素的大小為 1 個 byte,從全白到全黑是 255 到 0,參考 H.264 影 像壓縮演算法中的 Motion Estimation 的作法, 所以設定參考影像 (reference frame) 的數量為 5 張影像,目標影像 (current frame) 則會是連續 的多張影像。 PPE 部分的程式,首先要抓取進行計算的影 像,包含目標影像及參考影像,接下來設定 SPE 計算所需的參數,像是建立 SPE 的 thread,SPE 抓取影像的位址、回存移動向量的位址、區塊 的大小以及搜索範圍的大小,然後啟動 SPE,讓 SPE 開始計算,接下來可以先把下一張要做 Motion Estimation 的影像抓進來,之後就是等待 SPE 計算結束的通知,然後會視有無下一張影像 來決定要通知 SPE 抓取下一張影像或是結束運 算,然後將移動向量寫回檔案。 然後設計 SPE 的動作,首先會接收 PPE 傳 送的參數,然後根據這些參數抓取影像,在抓 取影像結束之後就會依照 Three-Step Search 的 動作開始尋找 SAD 最小值;完成之後就重複以 上動作計尋找下一個區塊的 SAD 最小值,到整 張影像結束,然後進行第二張影像的運算,直 到所有影像結束後會傳回所有的移動向量,然 後通知 PPE 計算結束,然後 PPE 會根據有無下 一張要計算的影像來決定通知 SPE 要抓取下一 張影像或是結束動作。 (二) 以 8 顆 SPE 平行運算進行加速 我們使用 8 顆 SPE 平行運算的方式與前面 提到那篇的做法不同,他的方法是將每張參考 影像放在不同的 SPE 裡面運算,而我們的做法 則是將原本的影像拆成八分,如圖 5.(a);與一 顆 SPE 計算一張影像比較,拿 8 顆 SPE 把一張 影像平分的作法在 DMA 傳輸的資料量就有差 別了,在一顆算一張影像的情況下,每顆 SPE 必須取得 2 張完整的影像,而拆成八份的作法 則只需要抓取目標影像的其中一份,以及從 5 張參考影像中抓取各一份及多出來的搜尋範圍 的資料,這個部份是因為在分割後在邊緣的區 塊的搜尋範圍並非不存在,而是與前一個分割 區共用,所以會有重疊的部份,這樣可以減少 許多的 DMA 傳輸量,而且 Motion Estimation 演 算法在不同目標區塊之間沒有相依性的存在, 所以這要切割得當,計算上是不會有任何的影 響;除此之外一顆算一張影像的做法還有一個 缺點,就是他真正的移動向量必須等所有 SPE 都計算結束,將各自的移動向量傳回給 PPE 之 後才可以由 PPE 從這些值中找出真正最適合的 移動向量,而我的做法則可以在 SPE 就直接算 出最後的移動向量。 為了因應演算法的改變,PPE 與 SPE 的動 作都需要跟著做改變,PPE 在設定 SPE 參數的 時候要多設定每顆 SPE 要計算的影像寬度以及 各 SPE 在抓取影像以及回存移動向量時需增加 的偏移量;SPE 則需要在抓取影像及回存移動向 量時將偏移量算進去才能做抓取及回存的動 作。 此外這樣的分割是將影像切在較短邊,這 樣不同分割區重疊的部分會較多,但如果把影 像翻轉,改成如圖 5.(b)的切割法,可以減少重 疊部分的總量,這樣就可以更加減少 DMA 需要 抓取的資料量。

(6)

SPE0 SPE2 SPE4 SPE6 SPE1 SPE3 SPE5 SPE7 SPE0 SPE2 SPE4 SPE6 SPE1 SPE3 SPE5 SPE7 SPE0 SPE2 SPE4 SPE6 SPE1 SPE3 SPE5 SPE7 SPE0 SPE2 SPE4 SPE6 SPE1 SPE3 SPE5 SPE7 (a) (b) SPE0 SPE2 SPE4 SPE6 SPE1 SPE3 SPE5 SPE7 SPE0 SPE2 SPE4 SPE6 SPE1 SPE3 SPE5 SPE7 SPE0 SPE2 SPE4 SPE6 SPE1 SPE3 SPE5 SPE7 SPE0 SPE2 SPE4 SPE6 SPE1 SPE3 SPE5 SPE7 (a) (b) 圖 5. 以兩種不同方式切割影像 (三) 以 SIMD 運算進行加速 使用 SIMD 的方式來加速主要是用在計算 SAD 的過程,原本的純量計算方式是將參考影 像中區塊的每一個像素與目標影像中區塊對應 的像素相減,然後取絕對值,再累加起來,這 樣的運算過於繁複且效率低,所以改用 SIMD 進行向量的運算以進行加速,由於設定的區塊 大小為 8x8 個像素,總共為 64 筆 1 位元的資料, 剛好可以存進 4 個向量變數裡面,然後向量變 數再依 圖 6.的方式,將每個參考影像的向量 變數與目標影像的向量變數使用 spu_absd 指令 將變數中所有的元素相減取絕對值,然後在將 其中任兩組的結果使用 spu_sumb 指令做加總的 動作,這個指令是將向量變數中 4 筆 1 個 byte 的元素加總變成 1 筆 2byte 的資料,然後兩個變 數各自的 4 筆結果交錯放置,然後原本 4 組原 本內容為 16 筆 1 個 byte 的資料的向量變數變成 2 組內容為 8 筆 2 個 byte 的資料的向量變數,然 後在用 spu_add 指令將兩組向量變數相加,變成 1 組內容為 8 筆 2 個 byte 的資料的向量變數,最 後再將這 8 筆資料兩兩相加,最後得到的結果 就是 SAD 值。 RF0 RF1 RF2 RF3 RF4 RF5 RF6 RF7 RF8 RF9 RF10 RF11 RF12 RF13 RF14 RF15 RF16 RF17 RF18 RF19 RF20 RF21 RF22 RF23 RF24 RF25 RF26 RF27 RF28 RF29 RF30 RF31 CF0 CF1 CF2 CF3 CF4 CF5 CF6 CF7 CF8 CF9 CF10 CF11 CF12 CF13 CF14 CF15 CF16 CF17 CF18 CF19 CF20 CF21 CF22 CF23 CF24 CF25 CF26 CF27 CF28 CF29 CF30 CF31 T0 T1 T2 T3 T4 T5 T6 T7 T8 T9 T10 T11 T12 T13 T14 T15 T16 T17 T18 T19 T20 T21 T22 T23 T24 T25 T26 T27 T28 T29 T30 T31 spu_absd spu_absd spu_sumb S0 S1 S2 S3 S4 S5 S6 S7 S8 S9 S10 S11 S12 S13 S14 S15 spu_add

SUM0 SUM1 SUM2 SUM3 SUM4 SUM5 SUM6 SUM7

|RF0-CF0|

ADD ADD ADD ADD

ADD ADD ADD SAD S0+S8 RF0 RF1 RF2 RF3 RF4 RF5 RF6 RF7 RF8 RF9 RF10 RF11 RF12 RF13 RF14 RF15 RF0 RF1 RF2 RF3 RF4 RF5 RF6 RF7 RF0 RF1 RF2 RF3 RF4 RF5 RF6 RF7 RF8 RF9 RF10 RF11 RF12 RF13 RF14 RF15RF8 RF9 RF10 RF11 RF12 RF13 RF14 RF15 RF16 RF17 RF18 RF19 RF20 RF21 RF22 RF23 RF24 RF25 RF26 RF27 RF28 RF29 RF30 RF31 RF16 RF17 RF18 RF19 RF20 RF21 RF22 RF23 RF24 RF25 RF26 RF27 RF28 RF29 RF30 RF31 CF0 CF1 CF2 CF3 CF4 CF5 CF6 CF7 CF8 CF9 CF10 CF11 CF12 CF13 CF14 CF15 CF0 CF1 CF2 CF3 CF4 CF5 CF6 CF7 CF0 CF1 CF2 CF3 CF4 CF5 CF6 CF7 CF8 CF9 CF10 CF11 CF12 CF13 CF14 CF15CF8 CF9 CF10 CF11 CF12 CF13 CF14 CF15 CF16 CF17 CF18 CF19 CF20 CF21 CF22 CF23 CF24 CF25 CF26 CF27 CF28 CF29 CF30 CF31 CF16 CF17 CF18 CF19 CF20 CF21 CF22 CF23 CF24 CF25 CF26 CF27 CF28 CF29 CF30 CF31 T0 T1 T2 T3 T4 T5 T6 T7 T8 T9 T10 T11 T12 T13 T14 T15 T0 T1 T2 T3 T4 T5 T6 T7 T0 T1 T2 T3 T4 T5 T6 T7 T8T8 T9T9 T10 T11 T12 T13 T14 T15T10 T11 T12 T13 T14 T15 T16 T17 T18 T19 T20 T21 T22 T23 T24 T25 T26 T27 T28 T29 T30 T31 T16 T17 T18 T19 T20 T21 T22 T23 T16 T17 T18 T19 T20 T21 T22 T23 T24 T25 T26 T27 T28 T29 T30 T31T24 T25 T26 T27 T28 T29 T30 T31 spu_absd spu_absd spu_sumb S0 S1 S2 S3 S4 S5 S6 S7 S0 S1 S2 S3 S4 S5 S6 S7 S8 S9 S10 S11 S12 S13 S14 S15 S8 S9 S10 S11 S12 S13 S14 S15 spu_add

SUM0 SUM1 SUM2 SUM3 SUM4 SUM5 SUM6 SUM7 SUM0 SUM1 SUM2 SUM3 SUM4 SUM5 SUM6 SUM7

|RF0-CF0|

ADD ADD ADD ADD

ADD ADD ADD SAD S0+S8 圖 6. 以向量 SIMD 方式計算 SAD (四) 以 Multiple Buffering 運算進行加速

Multiple Buffering 主要是用來減少 DMA 存 取資料的時候造成的延遲,作法是將原本 DMA 連續存取大量資料的動作改成單次存取較小量 的資料,然後將存取資料的時間與計算的時間 重疊來增進效能,作法是在 SPE 開始的時候先 將各自負責的目標影像與參考第一列的區塊計 算需要的資料先抓進來,然後在每次 SAD 的計 算之前使用一個 buffer 抓取目標影像的其中一 段資料,比較最小值之前使用另一個 buffer 抓取 一段參考影像的資料,在計算第一張參考影像 的時候參考影像與目標影像都要抓取,而在計 算第二張之後參考影像時,因為需要使用的參 考影像會在前一次的 Motion Estimation 計算時 就會被抓取進來,所以不需要再抓取;另外回 存移動向量的時候也是設計成每作完一列的區 塊之後就會將結果回存一次,也可以減少最後 回存資料的延遲。 設定的 buffer 大小會對整體運算的效能有 不小的影響,而且必須在一列的區塊運算結束 前必須把下一列的區塊的資料與其搜索範圍內 的資料抓取完畢,由於正在計算的那一列區塊

(7)

的搜尋範圍會與下一列區塊重疊所以如圖 7., 所以在計算下一列之前只要一張影像再抓超過 8*288 個像素就可以確保下一次計算資料的正 確性;一列總共有 36 個區塊,計算一個區塊可 以對一張影像抓取 3 份 buffer 大小的資料 (在三 個步驟各抓取一份) ,而 buffer 的大小只要 buffer 的大小大於 32 個 byte 就可以確保所有運 算資料的正確性。 8 7 7 Search_window_N+1 8 7 7 Search_window_N Block_ROW_N 8 Block_ROW_N+1 288 8 7 7 Search_window_N+1 8 7 7 Search_window_N Block_ROW_N 8 8 Block_ROW_N+1 288 圖 7. 區塊重疊部分示意圖 (五) 減少 branch 指令數進行加速 減少 branch 指令數的方法其中一項就是將 迴圈 unroll,前面使用 SIMD 的方式計算 SAD 值的動作也有 unroll 迴圈的動作,所以同時也會 減少 branch 的指令數,除了這部分之外,還有 SAD 最小值的判斷也可以使用減少 branch 指令 數的方式進行改良,以不使用 if 的判斷式來選 出最小的 SAD 值。 改良方式如圖 8.,是在各點的 SAD 值計算 出來之後先不進行比較,SAD 計算出來的結果 是存成 4 個 byte 的 unsigned integer,然後用兩 個向量變數來儲存其中的 SAD 值,然後使用比 較指令產生一個比較的結果,這個結果也是一 個向量變數內容為 4 組 4 個 byte 的比較結果, 其中在結果為大於的欄位會是 4 個 byte 全部都 是 1 的值,反之在結果為小於或等於的欄位會 是全 0;然後在用這個比較結果對原本的兩個向 量變數進行選擇,選出來的結果就是 4 筆較小 的 SAD 值,然後再重複以下面的算式計算及可 選出最小值。

(

)

(

)

(

)

(

)

(

)

(

& -1

)

| 1 -≥ & 2 1 2 2 1 1 min SAD SAD SAD SAD SAD SAD SAD < = (1) 這個原理是在 SAD1 與 SAD2 這兩個值經 過大於等於或是小於的運算之後會依照比較結 果產生 0 或 1 的值,兩個比較式中只會有一個 是 1,另一個則是 0;在減 1 之後則變成 0 或是 -1,-1 也就是所有的 bit 皆為 1,所以這個值就 變成了一個遮罩,與 SAD 值作 and 運算之後, 比較結果為 0 的那一項因為減 1 的關係變成-1, 所以會把該 SAD 值保留,比較結果為 1 的那項 因為減 1 之後為 0,所以在 and 之後值就為 0, 然後用 or 的方式將兩者合併,也就可以將 SAD 較小的值保留下來,這樣就達成了不使用 if 的 判斷式而單純使用算術運算及邏輯運算就得到 SAD 最小值的目的。

sad5 sad6 sad7 sad8 sad1 sad2 sad3 sad4

……… sad5 sad6 sad7 sad8 sad1 sad2 sad3 sad4

spu_cmpgt (大於的部分會是11111111) spu_sel(根據sel的值,0選擇第一個參數的值,1選擇另一個) EX:[0,1,4,7] EX:[8,5,2,0] [0,0,-1,-1] r0 r1 r2 r3 [0,1,2,0] sel

sad5 sad6 sad7 sad8 sad5 sad6 sad7 sad8 sad1 sad2 sad3 sad4

sad1 sad2 sad3 sad4

……… sad5 sad6 sad7 sad8

sad1 sad2 sad3 sad4sad5 sad6 sad7 sad8 ………

sad1 sad2 sad3 sad4

spu_cmpgt (大於的部分會是11111111) spu_sel(根據sel的值,0選擇第一個參數的值,1選擇另一個) EX:[0,1,4,7] EX:[8,5,2,0] [0,0,-1,-1] r0 r1 r2 r3 r0 r1 r2 r3 [0,1,2,0] sel 圖 8. 以向量 SIMD 方式選擇 SAD 較小值範例 但是這個方法會遇到一個問題,雖然已找 出最小值,卻無法知道這個最小值是由哪一個 點所產生的,這樣就沒辦法算出位移量,所以 必須再加入一個 SAD 來源的判斷,作法就是將 每次計算 SAD 值的點標上一個序號,然後建立 一個陣列存放由小到大的序號,算出的 SAD 值 的排列也是依照序號由小到大排列然後與前面 的步驟相同,以 spu_cmpgt 與 spu_sel 這兩個指

(8)

令先做出部分的比較結果,並且以相同的選擇 訊號對序號做出選擇,作到這裡可以得到序號 以及其對應的 SAD 值,然後將上面的式子稍作 改良如下:

(

)

(

)

(

) (

)

(

SAD LE

) (

SAD GT

)

SAD GT SEQ LE SEQ SEQ SAD SAD LE SAD SAD GT & | & & | & 1 -≥ 1 -2 1 min 2 1 min 2 1 2 1 = = = < = (2) 使用這樣的公式將得到的結果兩兩計算之 後即可得到最小的 SAD 值以及他的序號,這樣 就可以用序號來反推他的位移量,這樣一來就 可以徹底完成尋找 SAD 最小值及其移動向量的 計算了。

(六) Diamond Search 在 Cell 平台上的實現 在 Cell 平台上實現第二種演算法是為了證 明 以 上 這 些 加 速 的 方 式 並 不 是 只 針 對 Three-Step Search 的加速,而是不管演算法是使 用哪一種都可以以上述的加速方式進行加速, 這樣的加速法才能算是最佳化。

在 PPE 的部份動作與做 Three-Step Search 時相同,一樣是先讀取參考影像與目標影像, 然後設定 SPE 所需的參數,再啟動 SPE 開始運 算,並且在 SPE 運算的時候讀取下一張影像, 然後等待 SPE 結束傳回移動向量,最後根據是 否需要再計算下一張影像來決定市要結束程式 還是通知 SPE 抓取下一張影像。 SPE 部分的動作則是分為兩個部份,第一個 部份是位移 0 的位置以及距離他 X 軸與 Y 軸距 離和為 2 的 8 個點的 SAD 最小值,第二個部份 則是根據第一步的 SAD 最小值位置而向不同方 向擴散的動作。 首先將這九種不同的擴散動作記錄在一個 陣列裡,然後根據第一步的結果的最小值對應 的序號來查詢擴散的動作,擴散的動作又分為 三類,第一類是 SAD 最小值位在菱形的頂點的 情況,在這個狀態會以該頂點為中心向外擴散 5 個點,第二類狀態則是 SAD 最小值落在菱形的 邊上,在這個情況會沿著邊向外擴散 3 個點, 第三個狀態則是 SAD 最小值落在中心,會擴散 向上下左右一個像素的位置;第二部份的動作 會不斷的重複直到落入第三種狀態,或是在達 到搜尋範圍的邊界時會強制進入第三種狀態才 會停止。 為了實現這種動作我們將第三種狀態的序 號設定成 0,第一種狀態的序號設定成奇數值, 第二種狀態的序號設定成偶數值,這樣一來要 知道目前的狀態下需要計算幾個點的 SAD 值只 需要套用下面的公式即可算出,狀態為奇數的 時候計算結果就是 5,在偶數且非 0 的時候則是 3,在狀態為 0 的時候結果是 4,符合計算需求, 而且這樣的作法不需使用 if 判斷式,可以避免 branch 指令的產生以增加效能。其他的計算如 SAD 值的計算與 SAD 最小值的取得的作法都與 前面改良後的 Three-Step Search 相同。

四、模擬與分析

在本章將介紹使用的模擬環境及模擬的平 台,然後說明各個模擬的設定以及模擬之後的 結果,最後再針對模擬結果做出分析,判斷演 算法最佳化的結果是否合理。 (一) 模擬平台介紹

我們的模擬平台是建立在 IBM Cell B.E. SDK (IBM Cell Broadband Engine Software Development Kit),這是一套包含了編譯器與模 擬器的程式開發軟體,由編譯器產生執行檔並 由模擬器來模擬執行結果。模擬器會在原本的 OS 上以虛擬系統的方式模擬出 Cell B.E.的架 構,在模擬結果中可以得到總執行 cycle time、 各類型指令的指令數及該類指令的總執行 cycle time。 (二) 各加速機制之模擬結果 以下將針對各種不同加速方式的模擬結果 做分析,主要會針對完成計算參考 5 張影像的

(9)

移動向量的總 cycle、總指令數、CPI (cycle per instruction)、branch 造成的 stall 的 cycle 數、資 料相依所造成的 stall 的 cycle 數,branch 的指令 數等,使用的影像為 Foreman。 1. 以單顆 SPE 來執行程式 這是在完全不進行加速的情況下的模擬結 果,是最基礎的數據。這個結果所代表的意義 是在不加上任何加速機制的時候,以單顆 SPE 執行參考 5 張圖的 Motion Estimation 所需花的 時間。 表 1. 以單顆 SPE 執行動作估測演算法之效能

cycle Ins. count CPI Branch ins.

788568289 163670439 4.82 3201809 2. 以 8 顆 SPE 來執行程式 以 8 顆 SPU 將影像分割來平行處理,並且 比較縱切與橫切在效能上的差別。 這兩組數據的差別是在兩個做法需要抓取 的資料量不同,切割的時候交錯的範圍是一半 的 Search Window 的大小乘上影像的寬度,縱向 切割與橫向切割差別就在影像寬度,在橫向切 割的時候寬度是 352 個像素,縱向切割時寬度 則是 288 個像素,所以在以縱向切割的時候總 傳輸量會比較小。 表 2. 以 8 顆 SPE 使用不同分割方法執行動作估 測演算法之效能

cycle Ins. count CPI Branch ins.

8SPE(→) 99849193 68734436 1.45 433653 8SPE(↓) 98933062 68661246 1.44 397006 3. 使用 8 顆 SPU 並以 SIMD 方式來執行程式 這部份的結果是讓 8 顆 SPU 將影像分割 後,在計算 SAD 最小值的時候以 SIMD 的方式 來計算,影像以縱向分割的方式分割。 在加入以 SIMD 方式計算 SAD 最小值的做 法之後運算的模式出現了改變,除了總運算時 間的加快之外,在 SIMD 的機制也同時將 branch 指令數大量的減少,因為原本純量運算中計算 SAD 值的部份是以兩層的 for 迴圈來進行區塊 內每個像素的相減取絕對值的動作,在使用 SIMD 的加速機制之後,因為每個向量變數可以 存 16 個像素的值,只要使用 4 個向量變數來計 算就可以 unroll 這兩層 for 迴圈,所以可以大量 減少 branch 指令。 表 3. 以 SIMD 方式執行動作估測演算法之效能

cycle Ins. count CPI Branch ins.

44193412 28383761 1.56 36062

4. 加上 multiple buffering 的 DMA 傳輸

在不同 buffer size 的模擬結果如圖 9.,在剛 開始的時候因為 buffer size 太小,DMA 太快就 結束資料抓取,且由於 DMA 結構的關係,若要 DMA 以較高效率的方式工作必須將 buffer size 設定為 128bytes 的倍數,所以沒辦法與計算的 動作平行處理,而且設定 DMA 的動作次數太頻 繁所以反而會把效能降低;在中間區段因為可 以讓 DMA 抓取資料的時間配合上計算資料的 時間,所以會逐漸加速,再來又因為 DMA 抓取 資料的時間超過計算資料的時間,所以又開始 減慢;在後段則是因為 buffer size 太大,在 DMA 抓取一次資料之後剩餘的資料量不足以填滿 buffer,必須另外抓取,所以效能就不會有較大 幅度的變化。 Three-Step Search 43500000 43520000 43540000 43560000 43580000 43600000 43620000 43640000 43660000 43680000 0 2000 4000 6000 8000 10000 12000 14000 16000 18000buffer size cycle 圖 9. 不同 buffer size 下的效能

(10)

5. 加上以 SIMD 方式來計算並減少 branch 指令 因為 branch 指令在 branch miss 時會有巨大 的 penalty,所以用減少 branch 指令數的方式來 加速;使用的 buffer size 經測試最高效能情況還 是 buffer size=3072 bytes。

在加上減少 branch 指令的機制之後,branch 指令比單純使用 SIMD 的機制約可再減少 62.9% 的 branch 指令,由於 branch 指令減少,所以 branch miss 發生的機率也就跟著降低,所造成 stall 的 cycle 也就可以跟著減少。 表 4. 減少 branch 指令數後的動作估測演算法執 行效能

cycle Ins. count CPI Branch ins. 42432465 29228320 1.45 6904 6. 效能分析 以各加速機制加速之後的效能列出表 5., 以此表來分析效能的改進,在加入以 8 顆 SPE 平行運算的機制後,效能增進約為 7.97 倍。加 入 SIMD 資料平行運算的機制後的效能增進為 2.24 倍,然後使用 multiple buffer 的機制抓取資 料的效能增進為 1.04 倍,減少 branch 指令數的 方法則可以增進 1.03 倍。累積的效能增進如圖 10.。 表 5. 經過不同程度的加速後的運算效能 single SPE 8 SPE SIMD multiple buffering less branch

788568289 98933062 44193412 43509151 42432465 7.97 2.24 1.04 1.03 7.97 17.84 18.58 19.06 0 5 10 15 20 25

8 SPU SIMD multiple buffering less branch

效能增進 累積效能增進 圖 10. 增進的效能與累積的效能增進 減少 branch 的機制之所以看起來效果不好 的原因是因為 branch 在前面的機制像以 8 顆 SPE 分割影像以及以 SIMD 向量化運算都已經 將 branch 的數量大幅減少了,所以到這個步驟 的時候能減少的 branch 指令數已經不多了,所 以加速的效能較不明顯。 而 multiple buffering 的加速效果不好的原 因是因為總資料量不夠大,以目前的動作而 言,一次最多也只會傳送 17280 個 byte,在以最 大的 buffer size 的情況下只夠傳輸一次,所以加 速效能不明顯,但若是使用在高解析度影像的 時候,因為資料傳輸量大,所以就可以看出它 真正的加速效果。 7. Diamond Search 效能分析 Diamond Search 在實現最佳化運算之後效 能及與 Three-Step Search 的比較如表 6.,DS 由 於其從中心擴散的工作原理的關係,且使用的 影像是屬於動作量較小的,所以使用 Diamond Search 會有較高的效能。 表 6. Diamond Search 在經過不同程度的加速後 的運算效能

single SPU 8 SPU SIMD multiple buffering less branch

DS (cycle) 465806955 58225869 24882850 24158107 23228949

TSS (cycle) 788568289 98933062 44193412 43509151 42432465

(11)

而圖 11 則是 Diamond Search 的效能增進與 Three-Step Search 的比較圖,在加入 multiple buffering 機制時 Diamond Search 的效能增進較 少有可能是因為依照我的設計,Diamond Search 在計算的時候會有擴散的動作,因為無法確認 向外擴散的次數,這樣會變成無法估計資料抓 取的次數,勢必要使用判斷式來檢查資料是否 抓完,所以在我的設計上 Diamond Search 在進 行擴散的時候就不會抓取資料,可能這就是影 響效能的原因。 7.97 2.24 1.04 1.03 7.94 2.34 1.03 1.04 7.97 17.84 18.58 19.06 7.94 18.59 19.15 19.91 0 5 10 15 20 25

8 SPE SIMD multiple buffering less branch TSS效能增進 DS效能增進 TSS累計效能增進 DS累計效能增進

圖 11. Diamond Search 的效能增進與 Three-Step Search 的比較圖 8. 使用不同來源影像的效能分析 使用的第二組影像為 Stefan,這組影像與前 面所使用的影像相比,移動變化量會比較大。 使用兩種演算法運算結果如表 7。由結果可以看 出在移動向量較大的情況下,使用 Diamond Search 演算法會有較差的效能,而在相同的情況 下 Three-Step Search 的效能則不會有太大的改 變。 表 7. 兩組影像使用不同演算法的運算效能 Foreman Stefan DS (cycle) 23228949 26905246 TSS (cycle) 42432465 42403161 比較 1.82 1.58

五、結論

本論文的目的為設計動作估測演算法在 Cell B.E.處理器架構上進行運算最佳化。在最佳 化的演算法架構中,我們採用了以下幾種機制: (1) 以多顆 SPE 同步處理,進行 thread-level 的平行化處理 (2) 以 SIMD 的向量運算進行 data-level 的 平行化處理 (3) 以減少 branch 指令的方式降低 branch miss 時的 penalty 對程式效能的影響 (4) 以 multiple buffering 的方式減少大量 資料傳輸時,運算單元等待資料就緒的時間 經過模擬驗證之後,以上列四種機制對動 作估測演算法確實可以讓 Three-Step Search 與 Diamond Search 兩種演算法在最佳化後可以得 到 19~20 倍的效能,可以達到每張影像的處理 時間為 13.26ms。 在未來會將 H.264/AVC 的編解碼流程同樣 的進行最佳化,這樣一來 Cell 就可以符合完整 的視訊編解碼的標準,期望可以實現即時編解 碼的功能。

六、參考文獻

[1] Jim Kahle, “Cell Architecture”, International

Symposium on Microarchitecture archive Proceedings of the 38th annual IEEE/ACM International Symposium on

Microarchitecture, 2005

[2] C. R. Johns, D. Shippy, H. P. Hofstee, J. A.

Kahle, M. N. Day, T. R. Maeurer,

"Introduction to the Cell Multiprocessor," IBM Journal of Research and Development, Vol. 49, No. 4/5, July/Sept. 2005.

[3] Peter Hofstee, “Cell Today and Tomorrow”,

Ph.D., Cell Chief Scientist and Chief Architect

[4] IBM , “Synergistic Processor Unit Instruction

Set Architecture” Version 1.2

[5] Redbooks, “Programming the Cell Broadband

(12)

Practices”, published on 8 August 2008

[6] Brian Flachs, H. Peter Hofstee, IBM, Michael

Gschwind, Martin Hopkins, Sony Computer Entertainment, Toshiba ,Takeshi Yamazaki, Yukio Watanabe, “SYNERGISTIC

PROCESSING IN CELL’S MULTICORE ARCHITECTURE” , published by the IEEE Computer Society

[7] A. Hirano, K. Iinurna, T. Koga, T. Ishiguro

Y.Iijima, “Motion-compensated interframe coding for video conferencing,” in Proc. NTC 81, New Orleans, LA, Nov./Dec. 1981.

[8] Bing Zeng, Ming L. Liou, Renxiang Li,” A

New Three-Step Search Algorithm for Block Motion Estimation”, IEEE TRANSACTIONS ON CIRCUITS AND SYSTEMS FOR

VIDEO TECHNOLOGY, VOL. 4, NO. 4, AUGUST 1994

[9] Ashraf Ali Kassim, Jo Yew Tham, Maitreya

Ranganath, Surendra Ranganath, “A Novel Unrestricted Center-Biased Diamond Search Algorithm for Block Motion Estimation”, IEEE TRANSACTIONS ON CIRCUITS AND SYSTEMS FOR VIDEO

TECHNOLOGY, VOL. 8, NO. 4, AUGUST 1998

[10] Kai-Kuang Ma, Shan Zhu, “ A New Diamond

Search Algorithm for Fast

Block-MatchingMotion Estimation”, IEEE TRANSACTIONS ON IMAGE

PROCESSING, VOL. 9, NO. 2, FEBRUARY 2000

[11] Chun Ho Cheung, Chi-Wai Lam , Lai-Man

Po,” A NEW CROSS-DIAMOND SEARCH ALGORITHM FOR FAST BLOCK

MATCHING MOTION ESTIMATION”

[12] Artemakis Artemiou, Despo Othonos, Pedro

Trancoso, ” Data Parallel Acceleration of Decision Support QueriesUsing Cell/BE and GPUs ”, CF’09, May 18–20, 2009, Ischia, Italy.

[13] Haibo Lin, John Kevin O'Brien, Ling Shao,

Tao Liu, Tong Chen, “DBDB: optimizing DMA transfer for the Cell BE Architecture”, ICS ‘09

[14] Christos D. Antonopoulos, Konstantis

Daloukas, Nikolaos Bellas, “Implementation of a wide-angle lens distortion correction algorithm on the cell broadband engine “, ICS ’09

[15] Daniele Paolo Scarpazza, Gregory F.

Russell, ” High-performance regular expression scanning on the Cell/B.E. processor”, ICS ’09.

[16] Leonel Sousa, Svetislav Momcilovic, “A

PARALLEL ALGORITHM FOR ADVANCED VIDEO MOTION ESTIMATION ON MULTICORE ARCHITECTURES”, International Conference on Complex, Intelligent and Software Intensive Systems 2008.

[17] Leonel Sousa, Svetislav Momcilovic,”

PARALLEL ADVANCED VIDEO CODING: MOTION ESTIMATION ON

數據

圖 11. Diamond Search 的效能增進與 Three-Step  Search 的比較圖  8.  使用不同來源影像的效能分析  使用的第二組影像為 Stefan,這組影像與前 面所使用的影像相比,移動變化量會比較大。 使用兩種演算法運算結果如表 7。由結果可以看 出在移動向量較大的情況下,使用 Diamond  Search 演算法會有較差的效能,而在相同的情況 下 Three-Step Search 的效能則不會有太大的改 變。  表 7

參考文獻

相關文件

路徑 I 是考慮空氣的阻擋效應所算出的運動路徑。球在真 空中的運動路徑 II 是以本章的方法計算出的。參考表 4-1 中的資料。 (取材自“ The Trajectory of a Fly Ball, ” by

Other advantages of our ProjPSO algorithm over current methods are (1) our experience is that the time required to generate the optimal design is gen- erally a lot faster than many

各國的課程綱要均強調運算的概念性了解。我國 2009 年課程綱要談到所謂

綜合不同說話者觀點、論點」,在初中階段,可選用較簡單的

上列兩個範例是屬於連續型資料相同,但是組距不相同,比較看看,統計圖表有

• 一個簡單有效的 Hash function,又稱 RK 算法 (Rabin- Karp Algorithm/ Rabin fingerprint ).

1.列舉不同投影法的地圖數幅 相同地區,採用不同的投影法所繪製的 地圖,用以呈現,在不同投影下同一地 區有面積、方向、形狀上的不同 2.臺灣地區 1/25000 的地形圖

In the citric acid cycle, how many molecules of FADH are produced per molecule of glucose.. 111; moderate;