310 likes | 444 Views
針對開發細粒度平行性上的 架構支援. 黃 翔 Dept. of Electrical Engineering National Cheng Kung University Tainan, Taiwan, R.O.C 2012.12.05. 大綱. 摘要 引言 SLAM 實 作 任務堆疊 可竊取任務的緩衝器 通訊控制 網路 SLAM API 評估 總結及未來工作. 摘要. 近來的系統像是 Cilk ,它使用了傳統的語言像是 C ,但是當在寫程式時,支援一個大型函數型式 ( 無副作用 ) 的使用。
E N D
針對開發細粒度平行性上的架構支援 黃 翔 Dept. of Electrical Engineering National Cheng Kung University Tainan, Taiwan, R.O.C 2012.12.05
大綱 • 摘要 • 引言 • SLAM • 實作 • 任務堆疊 • 可竊取任務的緩衝器 • 通訊控制 • 網路 • SLAM API • 評估 • 總結及未來工作
摘要 • 近來的系統像是Cilk,它使用了傳統的語言像是C,但是當在寫程式時,支援一個大型函數型式(無副作用)的使用。 • 在Cilk運行時的一個重要部分是去讓一個系統平衡核的使用率。 • 在本文中,我們提出了SLAM(Spreading Load with Active Messages),它是基於在函式語言的評估技術上的一個動態負載平衡的系統。 • 我們展示了與適當的硬體支援所一起提供的SLAM,它明顯的勝過了Cilk系統。
1. 引言(1/2) • 可以使用多個核心去執行多個應用程式,但是為了達到更高的效能,在執行一個單一的應用程式時,必須去開發平行性。 • 然而,平行程式設計的困難是已知的。 • 多年來,這主要使用於科學上的應用程式,因為效能對於這些程式來說是最主要的。 • 許多平行性的複雜度來自於共用狀態的管理,以及來自於函式使得平行性能與相對應的減輕(ease)所一起開發的缺乏。 • 函式允許平行程式的表達,這些平行的程式常常較許多科學上的程式更不規律而且較為動態,但這對於更多的一般性的應用程式來說是一個優點。 • 然而,這會導致較低粒度的平行性以及對於在謹慎的運行中資源管理上的需求。 • 動態的負載平衡是Cilk系統一個重要的部分,並且已經顯示出產生了在平行架構上有效率的使用。
1. 引言(2/2) • 在本文中,我們所作的主要貢獻是: • 動態的負載平衡系統的實現,目的是使其工作在共用的記憶體CMPs上。 • 這系統提供一個簡單且基於在堆疊上的機制去評估平行的應用程式。 • 這使用了在任務堆疊(task stack)上的計算、同步以及通訊活動,這大大地簡化了它的實現。 • 對於在增加SLAM負載平衡系統的效率上,適當的硬體支援使得這能夠開發細粒度的平行性在它需要的時候,而且在與粗粒度的應用程式一起工作時仍然是有利的,而在與Cilk做比較時這顯示出較佳的延展性。 • 我們評估了SLAM,它分別使用了模擬著多達64顆核心且有著私有的和共有的L2快取的CMPs。 • 在平均上,我們的結果顯示出SLAM較Cilk好。
2. SLAM(1/4) • SLAM是一個高動態的平行計算模型,它設計去在多個核心之間動態的分配工作量。 • 它利用了工作竊取[5]以及懶散的任務創造[21]去平衡分派至每個處理節點上的工作量。 • 在SLAM中,每一個獨立的節點當作是一個任務。 • 一旦一個程式已經適當地使用多個獨立的節點所構成,程式設計者將詳細說明這裏面有哪些是可以在平行中執行。然後在SLAM運行中的系統將自動地處理負載平衡以及同步的議題。 • SLAM利用了分散的隊列去儲存多個要執行的任務。 • 一個隊列以一個任務堆疊(TS)的形式連接至系統中的每一個核心。 • 一個TSentry 的結構由3個指標所組成,這些指標指向了以下的元件: • 要執行的函數。 • 要使用的參數。 • 結果所需要的位址。
2. SLAM(2/4) • 為了去存取在每一時間必須要執行的任務,因此使用一個不同的指標,任務堆疊指標(Task Stack Pointer)。 • 一旦完成了一個任務就更新TSP去指向下一個要執行的任務,然後一直下去,直到完成計算。 • 這有兩種類型的任務要定義: 可竊取的和不可竊取的。 • 可竊取的任務可以由自己的處理器執行或是由遠端的處理器給偷去。 • 不可竊取的任務必須由自己的處理器執行。 • 這類型的任務包含了使用去完成同步以及負載平衡的任務。 • 所有的任務由自己的處理器push到TS上,並且pop出來執行並進行在一個LIFO的次序中。 • 對應至每一個任務的多個參數會儲存在主記憶體所維持的一個資料結構中,這稱作參數陣列。 • 一個簡單的例子說明SLAM如何工作,圖1顯示Nfib(5)在一個雙核的機器上的計算問題。
2. SLAM(3/4) • Am[n]是一個到參數陣列的第n個元 • 件指標針對在處理器m上。 • Am[n].i是Am[n]元件的第i個值。 • & Am[n].i是Am[n]元件的第i個值的記憶體位址。 • &TSm.i是任務堆疊m的第i個entry的記憶體位址。 • 三個指標分別是: • 左邊的指向要執行的函數。 • 中間的指向在參數陣列中的一個entry。 • 右邊的指向在一些其他的TSentry中的一個各別的區域。 • 後半部分是每個要回傳的值的位置。
2. SLAM(4/4) 圖1.Nfib(5)平行地計算在使用了 SLAM的雙核機器中。
Void Nfib(int n){ if(n<2){ RET_VAL 1; }else{ CONTINUATION(Add); overwrite Nfib with Add PUSH(Nfib, n-1, &x, 1); push Nfib in the TS………………..(6) PUSH(Nfib, n-2, &y, 1); ………………..(7) } NEXT_TASK; jump to the next task } Void Add(int x, int y){ RET_VAL x+y+1; } 圖4. 使用SLAM實現的Nfib函數。
3. 實作-任務堆疊(1/3) • 任務堆疊(TS)儲存著要去執行的任務。每一條entry包含三個指標到: • 1) 要執行的函數 • 2) 由函數所使用的參數 • 3) 結果所期望的位址。 • 還有一個暫存器的行為像是任務堆疊指標(TSP),它在每一時間指向要去執行的任務,並且根據處理器所完成的運算來作更新。 • 對於在從任務堆疊的資訊中分裂參數,主要的理由是為了允許簡單的TS操作最佳化以及去允許一個簡單的可快取堆疊的實現如下所述。
3. 實作-任務堆疊(2/3) • 1)任務堆疊快取: • 由於任務堆疊的操作在我們的模型中是重要的,我們提出在硬體上的支援來實現。 • 為了去提供一個不限大小的TS,我們實現了一個快取的階層。 • 由於大多的存取是發生在TS的頂端,存取的樣本是相當簡單且是可預測的。 • 附屬在每一個記憶體的第一層TS快取使用了一個環狀的緩衝器來實現。 • 緩衝器由兩個指示出緩衝器頂部及底部的指標所存取。 • 這些指標維持在處理器內的暫存器中以及在每一時間所更新的每一個 entry 會 push 到 TS 或是從 TS pop 出來。 • 當TS的空間用完時,多個最舊的entry的一個區塊會複製到下一層,這一層會產生空間去儲存更多的任務。 • 在相對的意思上,當需要先前所驅逐的entry時,會從在TS快取階層中的位置帶上來。
3. 實作-任務堆疊(3/3) • 2)任務堆疊的快取錯失: • 執行一個應用程式的一個可能的情況是當一個遠端的處理器發出一個先前偷去的任務已完成的通知,而這任務的TSentry沒有出現在L1 TS快取中。 • 為了改變函數的指標從Steal到Null,這entry必須去存取。 • 附近(local)存取到TS的快取總是發生在堆疊的頂端,這只會導致偶爾的錯失。 • 然而,一個遠端任務已完成的動作可能發生在堆疊中的任何地方。 • 最遭的情況是這些存取可能造成在附近和遠離的entry中間的trashing。 • 在我們所提出的實現中,當所描述的情形發生時,控制會轉換至記憶體管理單元。 • 這會在一個地方覆寫一個Null Task到適當的函數指標。 • 在這方式中,這種TS快取的錯失只會被當作一般的快取錯失處理。
3. 實作-可竊取任務的緩衝器(1/2) • 可竊取的任務會儲存在可竊取任務的緩衝器中(Buffer of Stealable Tasks)。 • 這是一個環狀的緩衝器,當可竊取的任務由處理器產生的時候,會儲存在這緩衝器中。 • 這些任務會同時放置在BST和L1 TS 快取中。當BST達到全滿時,之後可竊取的任務只會放到L1 TS快取中,直到在BST中的一些空間被釋出。 • 這使用兩個指標去決定在BST中可用的空間,一個指向它的底端,一個指向頂端。 • 這些指標維持在處理器中的暫存器,並且當一個新的任務被PUSH到BST中或從BST中POP出來時會在每一時間作適當的更新。 • 可竊取的任務從BST的頂端POP出來,這些是由自己的處理器執行。 • 當一個任務被偷取時,這是從BST的底部所取得。在這方式中,BST行為像是一個雙端隊列。
3. 實作-可竊取任務的緩衝器(2/2) • 除了任務的資訊外,在BST中的每一個entry也儲存了對應到TS項目所包含的位址。 • 使用這位址是為了去維持TSentry的紀錄,這紀錄了最初所放置的任務。 • 這資訊對於去設置對應到已完成的被偷取的任務的Null任務指標來說是有用的。 • BST允許去有效地服務多個遠端的請求,由於他讓可竊取的任務維持在處理器當前的區域上,甚至當那些任務從L1 TS快取中被驅逐時。
3. 實作-通訊控制(1/1) • 通訊控制(Communication Control)是一個控制器,他同步了所有與SLAM相關任務的通訊。 • 它處理任務將要去的處理器所發出的請求或從遠端處理器來的任務,連同被竊取任務的完成所相關的通知的產生和處理。 • 每一時間CC從一個遠端的處理器得到一個請求,他檢查是否在BST中有一個任務是可用的。 • 在可以輸出一個任務的情形中,CC從BST中將它pop出,並且將它送去給小偷。 • 在沒有可用的任務可以輸出的情形中,CC簡單地送出一個拒絕給小偷。 • 有了這個機制,當一個遠端的請求到達時,受害的處理器不必去保存任何的狀態;由於這沒有被中斷,因此沒有情境切換會表現出來。 • 如果處理器嘗試去存取它的TS當正服務一個請求時,將會呈現出局部的裁決以至於處理器得到停滯,直到請求已經被服務,在這之後它可以安全地繼續進行。 • 這機制消除了在TS中處理多個競爭環境的可能性。
3. 實作-網路(1/1) • 在所提出的實作中,在晶片上的處理器的內部連結會帶著SLAM的訊息如同在[24]中所描述。 • 這些訊息可以被使用去呈現負載平衡的運算。訊息的內容可以是: • 給一個任務的一個請求。這是由一個小偷處理器在每一時間所產生,他執行一個偷取的任務。 • 一個回答給一個遠端的請求。這回答可以是一個任務或是一個拒絕。 • 一個被偷的任務完成的一個通知。當一個回傳的任務被執行時,這由一個小偷處理器所產生。
3. 實作 (1/2) 圖2. 一個SLAM 節點的硬體組織。網路是共用給所有的節點。
3. 實作 (2/2) 圖3. 有著SLAM硬體支援的CMP的例子。
4. SLAM API(1/2) • 為了去取得SLAM基礎架構的優勢,應用程式必須要有到TS的存取針對在一個有效率的任務評估上。 • 我們提供使用了一個API的存取,這API暴露了多個TS操作的指令在一個較高的層級。 • 為了去說明TS是如何被操作,圖4顯示出一個Nfib(n)函數可能的實現。 • 多個SLAM函數簡單地提供存取到TS的硬體。
4. SLAM API(2/2) Void Nfib(int n){ if(n<2){ RET_VAL 1; }else{ CONTINUATION(Add); overwrite Nfib with Add PUSH(Nfib, n-1, &x, 1); push Nfib in the TS………………..(6) PUSH(Nfib, n-2, &y, 1); ………………..(7) } NEXT_TASK; jump to the next task } Void Add(int x, int y){ RET_VAL x+y+1; } 圖4. 使用SLAM實現的Nfib函數。
5. 評估(1/8) • 在這已經評估了兩個CMP的配置: • CMPs有著私有的L1快取以及私有的L2快取。 • 私有的L2快取有較低的 命中時間,但較小的快取容量。 • CMPs有著私有的L1快取以及共有的L2快取。 • 共有的L2快取有較長的 命中時間,但較大的快取容量。 • CMP的參數(沒有SLAM)列在表2中。 • SLAM硬體的參數列在表3中。
5. 評估(2/8) 圖5. SLAM 執行時間。這些值被正規化至對應到Cilk應用程式的執行時間。 越低越好。
5. 評估(3/8) 圖5. SLAM 執行時間。這些值被正規化至對應到Cilk應用程式的執行時間。 越低越好。
5. 評估(4/8) 圖6. SLAM 的加速相關於對應到連續的C應用程式的執行時間。
5. 評估(5/8) 圖6. SLAM 的加速相關於對應到連續的C應用程式的執行時間。
5. 評估(6/8) • 排序的應用程式顯示出較差的延展性,在MergeSort中只有2倍多,而在 Quick Sort只有3倍多。 • 在Quick Sort 中,由於資料共用在高層級中,造成一個高一致性的流量。 • 在 Merge Sort中,大量並行的記憶體配置為限制效能的主因。 • 另一個顯示出延展性受限的應用程式是Cholesky,較差的效能是因為較低的資料位置。 • 大部分的應用程式顯示出相對要好的延展性。 • 使用了L2私用快取的最大值從9.23(FFT Low)到 19.11(NQueens High),他們皆使用32核心。 • 使用了L2共用快取的最大加速從16.66(FFT High)到54.95(Heat)。 • 一般來說,平均上SLAM優於Cilk28% (44% 如果Nqueens的結果拿走) 當使用了有著私有的L2快取的32核心的CMPs。 • 針對在有著共用的L2快取的,平均上SLAM較Cilk快21% (31%如果 Nqueens的結果拿走)當使用了32核心的CMPs,以及較Cilk快62%當使用了64核心的CMPs。 • 最大的差異在當使用了32及64核心時。 • 事實在於少數的Cilk應用程式在32核心時變慢了。 • 一般來說,SLAM隨著核心數量而擴增。
5. 評估(7/8) • 偷取(steal)粒度: 另一個評估的部分是去獲得偷取粒度的量測。 • 偷取粒度在這環境中,是一個處理器在它已經從受害者那偷取一個任務之後執行到它再次偷取之前的週期總和。 • 一般來說,一個偷取被認為是較多或較少有利的於依賴在所產生的偷取粒度上。 • 這越大,偷取越有利。 • 有利的偷取粒度導致較少的偷取,反過來說,造成較少的時間去表現出負載平衡的積極性。
5. 評估(8/8) 圖7. SLAM 和Cilk平均侵占粒度分布針對再與不同的處理器個數一起評估的應用程式 C 和S 屬於分別對應到Cilk和 SLAM的bars。
7. 總結及未來工作(1/1) • 本文已經提出了SLAM,一個平行計算的模型,目的是要工作在共用的記憶體晶片多處理器上。 • 我們評估我們提出的系統,它使用了一組分開-然後-佔領(divide-and-conquer)的應用程式在有著分散地私有及共有的L2快取的CMPs中,並將我們的系統與Cilk做比較。 • 我們的結果顯示出,對於標準程序的評估,SLAM平均上比Cilk要好。 • 我們的結果也顯示出所產生的額外成本當創造多個任務在SLAM中時是較低的。 • 當執行多個所產生的極細粒度的任務的應用程式時,這是主要的優勢。 • 較大量的偷取粒度貢獻出一個較小且與負載平衡運算相關的額外成本,這得到一個較佳的整體效能。 • 未來工作牽涉到將SLAM與其他硬體排程系統像是Carbon一起做評估,為了去更加了解我們模型的能力。 • 在應用程式方面,這需要去實現一個與編譯器結合在一起的預先處理的系統,這編譯器支援去允許一個更自動化的產生平行的應用程式。