1.1 研究動機
String 在程式語言中是很基本的資料結構,無論是各種字串演算法之應用 [1-3],或是 text 檔案的 parsing,String API 無疑地有很重要的地位。字串是一個 很原始的人機互動管道。在 GUI 未流行以前,程式設計師便是以 commands 對機 器下指令,或乾脆把許多 command 寫成一份 batch file,機器解析這些 command 並執行對應動作;相似地,當今許多 web 和 script 語言結合,網頁的執行或 script 的 interpreting ,也都是屬於 String manipulation 的應用。在網路安全領域中的 研究,許多網路入侵偵測和封包檢測系統使用硬體加速器來加速 String matching 之速度[4-6]。在 Java Processor 領域中,雖然在許多案例中有許多 instrution-level parallelism、object cache、method invocation 方案等等研究 [7-9]。然而,對於字 串處理的能力尚未有深入的分析和研究。
過去,有許多 Java 處理器的研究[7-13],但都沒有針對字串處理進行優化。
其中一個對 Java 語言支援較完整的可合成的 Java 處理器是 JAIP(Java Accelerator IP),根據郭等人的研究指出[9, 14], JAIP 對於字串處理方面,與同樣針對嵌入 式系統之 JVM─CVM(由 Sun Microsystems 所開發)相比,效能有著明顯的落後。
之所以 JAIP 對於字串處理能力這麼不足的原因是因為它字串處理的實作方式,是 由 Java core 透過 IPC 介面來對 RISC core 做字串操作、object instantiation 和 array creation,而 IPC 介面是由 ISRs 來實作,兩個 core 之間的溝通成本相當的大。本 研究除了透過 Heap Management Unit 改善物件與陣列創建的 IPC overhead 之外,
我們更設計與實作一個 method profiler 與 bytecode profiler 深入分析 JAIP 之字串 處理效能資訊,並根據此分析結果,我們提出一個 String Acceleration Architecture。
此架構內包含一個針對 JAIP 處理器設計的 Hardware Native Interface 以及兩個字
1
串操作加速器。
字串操作與其他 data type 之操作有明顯的不同,數值型態的運算主要是以 arithmetic 和 logic,而字串除了 comparison 和大小寫轉換之外,稍微較少使用到 ALU。字串操作主要有 concatenation,compare 及 subString 之 matching 等等操作,
特點就是用到許多記憶體存取指令。除此之外,字串 concatenation,subString 之 matching 或是 StringBuffer 容量之擴充等操作時,程式至少都是由一層以上之迴圈 控制連續字元存取,處理器對迴圈的效力也會影響字串操作。因此,一個對連續 記憶體存取具高效能處理器架構是必要的。
1.2 研究貢獻及目的
本論文在一個異質雙核心 JAVA 應用處理器的嵌入式系統環境裡進行整體效 能的評估與改進。JAIP 一個高度可移植性 IP core。在這個應用處理器中,JAIP 是一個具高度可疑質性的 Java IP core,負責處理所有 Java bytecode 的執行。而在 JAIP 裡,有許多效能瓶頸未解決,例如在進行物件解析的時候,動態符號解析器 (Dynamic Symbol Resolution Unit)花費相當多的時間,整個 JAIP 處理器整個管線 必須暫停等待或者是插入 nop 指令讓沒有工作的管現階段暫停。礙於架構的限制,
當程式大量使用原生方法時,例如字串類別,也對我們的效能產生極大的障礙。
本篇論文研究重點是找出這些效能瓶頸,並且提出有效的解決方案。
為了讓 JAIP 完整支援字串操作,我們對 JAIP 增加了類別初始化方法(Class InitializationMethod)呼叫的功能。我們盡可能地降低 JAIP 與 RISC-core 溝通次數,
我們在 JAIP 中建立了 Heap Management Unit,使得 JAIP 在不需要使用 IPC 介面 來完成物件與陣列之創建動作。此外,為了讓 JAIP 支援更多字串操作與系統類別 操作,我們完成了每個類別之靜態初始化函式(clinit)之呼叫動作。這個函式的呼 叫,可以讓每個類別的靜態變數做初始化,使得 JAIP 可以支援更多 Java 語言特 性與 API,其中包括許多字串操作與字串打印。目前我們支援將近 31 個標準 Java
2
系統程式庫的字串運算程序,而剩餘的方法是受限於資料型態的因素而暫時不支 援。
本論文第一部分是針對 Java 程式使用字串類別的案例來做分析及優化。分析 方法也是使用硬體剖析器。剖析字串操作的剖析器─method profiler 剖析了兩類資 訊:1.各類別之方法被呼叫次數 2.各類別之方法硬體使用時間分布。剖析 bytecode 的剖析器─bytecode profiler 同樣剖析兩類資訊:1.各 bytecode 之使用次數 2.各類 別之方法硬體使用時間分布。硬體使用時間分布是將程式執行時間切割為四種時 間:1.管線時間 2.記憶體存取時間 3.中斷時間 4.動態解析時間。
第二部分是根據剖析結果,我們設計並實作了兩個字串加速器,並為了讓 Java 支援對底層硬體操作,我們也設計了一個讓 JAIP 裡面的 byetcode ececution engine 直接透過 dynamic resolution 機制來操控硬體設備或電路之介面─Hardware Native Interface。透過這個介面,Java 程式語言可以使用兩個特殊用途之硬體加速器來 實作數個 string method。特殊用途之硬體加速器有:1.一個 arraycopy 硬體加速電 路來實作 Java 中 arraycopy 的方法。此電路能夠透過 Processor Local Bus(PLB Bus) 來控制記憶體控制器(Memory Control Unit)進行大量的連續記憶體存取來實現陣 列的複製操作。2.第二個字串加速器為 indexOf。indexOf 方法在 Java 語言中是進 行字串搜尋:給定一個正文及一個字串,搜尋此正文裡面是否存在這個字串。在 這個 indexOf 硬體加速電路中,我們使用創新的字串比較概念─每次進行 3 個字 元的比對,這個方法可以減少將近兩倍的迴圈數目。
1.3 論文架構
本論文一共包含 5 個章節。第一個章節是一個蓋括性的導論,包含了研究動 機、背景及目的。第二章介紹相關研究與 JAIP 之先前研究,相關研究部分,分成 三個小節,分別是 1.Java processor,2.Java 之 hardware interface,3.hardware string matching。第三章為詳細的設計與實作介紹,包含了字串操作實作、profiler、
3
hardware interface 與字串加速器。第四章為幾種字串加速器之效能評估實驗與測 量。最後,第五章為本篇論文的結論與未來研究方向。
4