• 沒有找到結果。

本計畫主要是提出一套多核心嵌入式系統之效能分析與耗能評估方式,並基於一個現 有的多核心嵌入式系統開發平台 (ARM11 MPCore 開發平台 [23] [24] [25] ),實做出一套 適用多核心嵌入式系統的效能與耗能之監測與分析工具 (mProfiler),就開發環境上來說,

本計畫使用的作業系統核心是 Linux kernel 2.6.19,開發工具是 GNU Toolchain for ARM Processors GCC 4.2.1 與 Glibc 2.5。本計畫開發之工具將提供多核心嵌入式系統設計者效能 分析 (Performance Analysis) 和耗能評估 (Energy Estimation) 兩大類資訊,以下章節將先說 明 mProfiler 的軟體架構 (software architecture),再分別描述效能分析與耗能評估的設計與 實做方式。

4.1. 軟體架構 (Software Architecture)

本計畫提出之 mProfiler 的軟體架構圖如圖 1 所示,圖中依據硬體平台 (ARM11 MPCore Platform)、作業系統 (GNU/Linux) 和使用者程式 (User Space) 分成三層,並以白 色方塊標示出既有之軟體或是硬體元件、藍色方塊標示出本計畫加入或修改的程式碼,而 橘色方塊則是表示本計畫蒐集的資料,包含時間 (time) 與功率 (power) 的相關資訊。

為了讓使用者方便使用,mProfiler 主要是以使用者程式的方式呈現 (如圖 1 之

"mProfiler" 區塊所示),多核心嵌入式系統開發者可以透過 mProfiler 創造 (fork) 出目標軟 體 (如: benchmark program) 的行程 (process),此時本計畫擴充之作業系統核心 (kernel extension) 便會開始動態蒐集目標軟體的時間資訊並儲存於作業系統核心中,在目標程式執 行期間,mProfiler 也會週期性地透過系統呼叫 (system call) 的方式讀取並蒐集硬體平台上 ADC (Analog to Digital Converter) 提供的功率資訊,且將蒐集到的功率資訊儲存於 mProfiler 中。當目標軟體結束執行 (exit) 之後,mProfiler 也會跟著結束執行,並將蒐集 到之時間與功率資訊做整理歸納之後統一回報給使用者。另外,為了解軟體的效能與耗能 對核心數量變化的擴充性 (scalability) 優劣,mProfiler 也可以透過 ARM11 MPCore 處理 器的驅動程式 (device driver) 將部份處理器核心切換至 WFI (Wait for Interrupt) 模式,以達 到變動系統處理器核心數量的目的。

圖 1 mProfiler 軟體架構圖

4.2. 效能分析 (Performance Analysis)

就效能分析上來說,本計畫提出之工具 (mProfiler) 主要針對軟體的執行緒層級平行度 (Thread-Level Parallelism, TLP)、負載平衡 (Load Balance) 與軟體效能瓶頸 (Performance Bottleneck) 等三大項目做評估,以下將個別說明之。

4.2.1. 執行緒層級平行度 (Thread-Level Parallelism, TLP)

在多核心系統上,軟體通常需由單執行緒 (或單行程) 程式改寫成為多執行緒 (或多行 程) 程式,才能提供足夠的工作量讓數個處理器核心同時處理,進而縮短程式的生命週期 (life time),為驗證一個多執行緒軟體是否在執行期間總是提供足夠的工作讓硬體執行,

mProfiler 會紀錄多執行緒程式中,每個執行緒被創造出來的時間點以及它們個別的生命週 期長度,以讓多執行緒軟體開發者了解程式中每個執行緒是否有如預期般地被創造與執行,

4.2.2. 負載平衡 (Load Balance)

若要了解軟體是否已有效利用多核心處理器的硬體資源,除了檢視軟體提供的執行緒 層級平行度之外,還必須要確認系統上的執行緒是否有被多核心處理器平行執行,若是軟 體提供了足夠的執行緒層級平行度,但這些執行緒卻只在少數幾顆處理器核心上執行的話,

則多核心處理器的硬體資源仍不算得到有效利用。為此,mProfiler 將辨識出每個執行緒的 執行時間 (run time) 花費在各顆核心上的比例,讓多核心嵌入式系統的開發者能夠了解系 統上的執行緒是否有妥善利用多核心處理器提供的硬體資源,以避免工作分配不均勻而導 致能量效率不佳的狀況發生。

在 Linux kernel 中,可以透過呼叫 smp_processor_id() 巨集 (macro) [26] 得知 執行目前程式碼的處理器核心編號,因此只要在 kernel/sched.c 的 schedule() 函 數內,將統計到的執行時間透過處理器核心編號分類統計,便可取得執行時間花費在各處 理器核心上的比例。

4.2.3. 軟體效能瓶頸 (Performance Bottleneck)

為提供軟體設計者更進一步的建議,本計畫把一個多執行緒程式中每個執行緒的生命 週期分成執行時間 (run time)、等待時間 (block time) 和其他時間 (other time),讓軟體設計 者 了 解 每 個 執 行 緒 的 效 能 瓶 頸 , 進 而 針 對 演 算 法 、 執 行 緒 間 的 資 料 同 步 負 擔 (synchronization overhead) 或是平行度做改善,各類時間的意義與取得方法說明如下:

(1) 生命週期 (life time)

執行緒從被創造出來到執行結束的時間長度。此時間可被用來評估執行緒層級平行度,

詳細說明請參考 4.2.1。mProfiler 從 kernel/fork.c 檔案裡的 do_fork() 函式替 新執行緒建立完 task_struct 之後開始計時,直到執行緒執行 kernel/exit.c 檔 案裡的 do_exit() 函式之後才停止計時。

(2) 執行時間 (run time)

執行緒被處理器執行的時間總和。mProfiler 除了提供執行時間的累計值之外,另外還 提供執行時間在使用者模式 (user mode) 和核心模式 (kernel mode) 下的比例,若是使 用者模式佔去大部分的執行時間,表示使用者程式的演算法需要做進一步的改善;反之,

若是核心模式佔了大部分的執行時間,則表示使用者程式使用了過多的系統呼叫

(system call) 或是系統呼叫的程式碼需要改善。執行時間的累計值可透過修改 Linux kernel 的 kernel/sched.c 檔之 schedule() 函數取得,即讓執行時間在目標執 行緒被內容切換 (context switch) 至執行狀態 (running state) 時開始計時,直到該執行 緒從執行狀態被切換回預備狀態 (ready state) 後才停止計時並做時間累計。而使用者模 式 (user mode) 和核心模式 (kernel mode) 的時間比例則是利用 kernel 在執行緒之 task_struct 內維護統計的 utime 和 stime 兩個欄位作為參考。

(3) 等待時間 (block time)

執行緒間因資料同步 (synchronization) 而需等待的時間總和。當一個程式從原本的單執 行緒程式改寫成為多執行緒程式後,程式的執行緒間通常需要透過共享資料 (shared data) 來相互溝通以便進行工作分配等事宜,為確保共享資料的正確性,執行緒會利用 適當的同步機制 (如: mutex, semaphore) 來保護共享資料。mProfiler 藉由提供同步機制 帶來的等待時間長短,讓軟體開發者能夠了解各執行緒間溝通機制的優劣,進而調整資 料同步的時間點或是減少不必要的共享資料量,以增加執行緒的效能。本計畫目前是針 對 POSIX Threads 函 式 庫 使 用 到 之 futex 同 步 元 件 進 行 等 待 時 間 量 測 , 因 此 在 kernel/futex.c 檔內的 futex_wait() 函式內開始計時,並在 futex_wake() 函式中結束計時並累計時間。

(4) 其它時間 (other time)

此時間是由執行緒的生命週期扣除執行時間和等待時間得來,若此時間很長,表示系統 中可能有過多的工作,讓處理器核心忙於處理系統上的其他執行緒而使得目標執行緒的 生命週期變長,這個訊息告訴多執行緒程式的開發者,與其改良執行緒的演算法,不如 減少系統中之執行緒數量,可能可以更有效地縮短多執行緒程式的生命週期。

4.3. 耗能評估 (Energy Estimation)

以耗能評估而言,mProfiler 主要以 ARM11 MPCore 之 Core Tile 上的 ADC (Analog to Digital Converter) 作為得到功率 (power) 資訊的參考來源,ARM11 MPCore 之 Core Tile 上具有一個 ADC 裝置[24] ,如圖 2 所示,該 ADC 裝置會持續地偵測流經處理器和 PLL (Phase-Locked Loop) 的電壓值和電流值,並將這些數值轉換成數位資料之後,存入 ARM11 MPCore 評估板 (Emulation Baseboard) 上的暫存器 (SYS_SET_VOLTAGEx) 中,之後軟體

便可以透過讀取這些暫存器並做下列運算,而得到處理器和 PLL (Phase-Locked Loop) 的電

關於暫存器 (SYS_SET_VOLTAGEx) 的實體位址與格式可參考 ARM11 MPCore 之 Core Tile 的說明文件 [24] ,在得知這些暫存器的實體位址之後,便可利用系統呼叫的方

相關文件