2009年6月16日 星期二

Cell Programming 工作報告 - 逼逼逼



我發的前幾篇標題都不好,所以另開一篇標題。


11/24 報的paper:Optimizing Assignment of Threads to SPEs on the Cell BE Processor





請點此



另外進度報告
我們切的方式是要在QP=25,INTRA_PERIOD=30才能得到最好比較好的Performance

----------------------------------我是分隔線--------------------------------
12/01

請點此


測了幾個Block的時間~
最先一開始是讓SPE去讀檔案,然後扣掉檔案的讀取時間。
所測得的時間非常不穩定,時間上下抖動的範圍太大。
之後就想到,疑?是不是讓PPE去讀進來放到External Memory,
然後再去從External Memory去抓這些資料就好。

試了之後效果還不錯,
不過這又產生一個大問題了。
當PPE去讀取很大筆的資料放到Memory,例如要花了兩百多MB。
當我去測它的執行時間時,它的執行時間範圍就有時2秒、有時51秒。
差距非常大。我想了一想,也許是用到虛擬記憶體導致變慢。
所以我將要讀進來的檔案切成五等份, 每一等份是23681筆資料。
每一次我就只做一等份,之後再將這所有的五等份時間相加,得到每一個component時間。
之後所測得的時間就蠻穩定的。

註:老師說時間很奇怪,建議只接收一筆資料,同一筆資料做很多次。
再測其時間看看有沒有變。

----------------------------------我是分隔線--------------------------------
趕緊來記一下跟老師討論的文件大綱

第一章 Overview(大綱,提到Toshiba)
第二章 Cell BE硬體架構
第三章 編譯環境
3.1 PS3上的作業系統 - Yellow Dog Linux
3.1.0 安裝作業系統
3.1.1 介紹Toolchain
3.1.2 如何編譯
3.1.3 其他Compiler (XLC compiler)
3.2 Cell Simulator
3.2.0 安裝Simulator
3.2.1 介紹Simulator的各種mode
3.2.2 如何編譯
3.2.3 各種mode跑幾個範例
第四章 Library的使用:寫程式介紹很多API
第五章 自製Toolchain

---------------------------我是20081208分隔線-----------------------------
投影片內容說明了我們怎麼測SPE的時間
另外還有Queue的實作方式,未來會越改越好地。(希望)

註:拿GNU Pofiler測試一下時間,確定各個block時間的合理性

Future work就是把Queue通通的改成漂亮的Queue,
然後做小實驗。

我是投影片

---------------------------我是20081222分隔線-----------------------------

今天報了有關Cell B.E. blocking, non-blocking channel的介紹
Intro: 每一個SPE上MAILBOX或Signal或其實都是一個個的channel。
透過MMIO(Memory Mapped I.O.)去抓取任何一個channel都將是non-blocking。
SPU讀寫channel的話,要根據channel的type決定是blocking或non-blocking。

我是投影片

進度報告:
實作了將DMA做成多筆一次傳,跑出的數據是多少。
實作了另一種版本的Queue,此版本Queue只有一次DMA,測出數據是沒有達到預期效果。
未來要再解一些bug。

刪了某些圖的投影片

---------------------------我是20081229分隔線-----------------------------

1.
今天報告另外一種切割的方法,簡單的說就是做os的task分配的意思,讓每一個block都能
夠滿滿的、負擔都差不多,不要一直只等著事情做。

2.
報告程式流程

Future work:
解決在一開始的初始化時資料被蓋掉的情況


註:下星期與忠和學長討論有關SystemC的部份

投影片

---------------------------我是20090105分隔線-----------------------------
一. paper的outline
data-flow for mpeg4 decoder on cell
1. Introduction
i) multicore programming
ii) data-flow, Pipelined
iii) MPEG4 on cell
iv) cell architecture, programming thread communication
v) Related Work Difference (only MB-level parallelism)
vi) Contribution
2. Design Methodology
i) mpeg-4 component graph
ii) profiling computation communication
iii) Task Allocation
3. Queue Implementation
i) Mailbox/Signal/DMA Synchronization
ii) Batch Transfer
4. Experiment Results
第一個是不同傳輸方式
第二個是不同切法
第三個是不同node數
5. Conclusion

二. 書的outline
當然是還沒有...
目前我有稍微看過阿六仔寫的書,我還沒有看的很仔細。因為看簡體字也需要想一下。
個人觀感是書的前半部份感覺像是英翻中的手冊,例如講一下SPE的架構,然後列出有哪些指令可以用,感覺比較稍微草率一點,後半部份的某些章節我覺得還不錯,例如它有一章列出你可能會遇到哪三樣錯誤,然後這錯誤大概是因為什麼。
我覺得這章節很不錯,如果使用者遇到的錯誤都能在這本書找到所以然,這本書的價值也許會比較高。





---------------------------我是20090108分隔線-----------------------------


Toshiba SpursEngine
Toshiba所出的這塊媒體串流器(SpursEngine)與Cell B.E.的不同點有






1. Cell B.E有8顆SPE,SpursEngine只有4顆


2. 為了Low Power的設計,將減少的4顆SPE換成MPEG-2與MPEG-4/H.264 Encoder/Decoder


3. 不採PPE為主CPU,可用PC上的Intel Processor


4. IO變更





以上4點摘自 東芝半導體公司披露繼承Cell設計構思的處理器真面目





reference:


[1] Full HD趨勢化的波濤,掌握加工編輯關鍵的影像處理引擎


提到了各種影像處理的加速卡優缺




---------------------------我是20090217分隔線-----------------------------


1. 本書導覽

2. Cell BE 硬體架構
2.1 PowerPC Processor Unit
2.2 Synergistic Processor Unit
2.3 Element InterConnect Bus

3. Cell BE 工具列
3.1 安裝Yellow Log Linux
3.2 安裝軟體開發工具列SDK3.0
3.2.1 Cell Simulator
3.2.2 compiler
3.2.3 Eclipse IDE

4. Cell Programming基本概念
4.1 Process and Thread
4.2 Create SPE Thread
4.3 Create PPE Process
4.4 編譯程式

5. Direct Memory Access
5.1 MMIO concept
5.2 DMA concept
5.2.1 mfc_put, mfc_get
5.2.2 barrier和fenced
5.2.3 alignment
5.3 DMA List
5.4 Double buffer
5.5 Atomic Method

6. 訊息傳遞與同步
6.1 Mailbox
6.1.1 介紹SPE的Mailbox種類
6.1.2 PPE與SPE之間的通信
6.2 Signal
6.2.1 介紹SPE的Signal種類
6.2.2 PPE與SPE之間的通信
6.2.3 OR-mode與Overwrite Mode
6.3 使用DMA達到SPE之間訊息傳遞
6.4 使用Queue達成資料資料傳遞

7. Vector Programming
7.1 在PPE上使用SIMD
7.2 在SPE上使用SIMD
7.3 PPE與SPE上使用SIMD的異同

8. 錯誤解決

---------------------------我是20090224分隔線-----------------------------
今日報告,
完成Queue Type II的Doble Buffer,
我們交互使用兩個不同的參數與標籤(TAG),以節省Communication time。

未來要做的事
1. channel(queue) code generator
2. scheduler code generator

欲先完成第一件事,在經過簡單的程序建立如下的Graph後,
能夠幫我在每個core build channel,並在consumer core初始化queue。















scheduler code generator要等到我把這個先弄完才會繼續,

目前怕參數太多,產生出來的code很複雜。



老師的comment:

1. 未來Cell Programming搭配OpenESL GUI,拉幾下就就可以build connection (這點應該沒問題)

自動產生scheduler,需要user告知scheduler額外資訊。



今天我誤會老師問我的問題?老師問說scheduler寫在哪裡?

scheduler的code當然是另外寫的一支程式,產生的code是跑在componenet裡。

我以為老師是問產生的code跑在哪。



我們目前是想說scheduler會產生一張圖,什麼時候哪個core該做什麼事,都在這張圖上。











目前大概就是這樣,萬事都想好,只欠一步一步完成。



---------------------------我是20090303分隔線-----------------------------

















欲用一個Graph來代表Core與Core之間的溝通機制,
所以我們建一個Graph,經由加Vertex與Directional Edge(有向邊),
語法
1. Add Vertex ex: myGraph.AddEdge(VLD);
2. Add Edge ex: myGraph.AddEdge("VLD","IMC1","IQ_para","IQ_ARRAY");
Vertext 代表module name,Edge代表channel,如同我們在SystemC語法宣告一個channel,
必須給它一個channel type和channel name,後面這兩個變數就是這個Edge的Feature(屬性)。

依據這個圖我們可以分析每個Vertex,它是當了幾個Core的Producer,自己是誰的Producer。
根據這樣的資訊建立channel initialize Code。
下一步就是scheduler code generator,而scheduler code還在改,希望能簡單到可以自動產生,不然原本的code太複雜了。

-----------------------我是20090317分隔線-----------------------------

User一開始會給我們以下幾個資訊

0. DataFlow的流程圖


1. Core的數目,Ex: 現在要跑在6個core上面

2. 每一個Task的loading Ex: VLD必須花500 ms,IMC花2000ms等等的資訊



我們根據以上的資訊,找出最好的Duplication

演算法我們這邊就不提,以後補上。

根據演算法我們會產生每一個Core的Scheduler Graph,如下圖11個duplication分給6core




















根據這張scheduler graph,我們能夠建一張Table描述core與core之間的communication關係之後根據這張Table我們就能跟建立之前我們所說的communication graph,之後就能使用communication(channel) code Generator。目前只做channel code Generator,接著再將code改一改就能完成codeGen了。
老師今天的comment:
1. Eclipse GUI與阿凡討論,列出規格與規劃進度,之後meting拿出來討論進度
2. 4月之後希望能開始改SIMD,然後將改完的SIMD的時間再來重新build graph,讓大家知道不一樣的load會產生不同的scheuler graph
3. 希望未來能再porting一個codec上去,希望這個scheduler code generator是夠general的




















































































































































































































































































































































































































Core 0 VLD0VLD1VLD2VLD3VLD4IQ3VLD5IQ4VLD6IQ5VLD7IQ6IDCT2VLD8VLD9IQ8VLD10IQ9IQ10
Core 0 0~419419~838838~12571257~16761676~20952095~27052705~31243124~37343734~41534153~47634763~51825182~57925792~80658065~84848484~89038903~95139513~99329932~1054210542~11152
Core 1 IDCT3IMC0IDCT5IMC1IMC2IMC3IMC4IDCT8IMC5IMC6IMC7IMC8IMC9IMC10
Core 1 2705~49784978~54845484~77577757~82638263~87698769~92759275~97819781~1205412054~1256012560~1306613066~1357213572~1407814078~1458414584~15090
Core 2 PB0PB1PB2PB3PB4PB5PB6IQ7PB7IDCT7PB8PB9PB10IDCT10
Core 2 419~11621162~19051905~26482648~33913391~41344134~48774877~56205620~62306230~69736973~92469246~99899989~1073210732~1147511475~13748
Core 3 IQ0IQ1IDCT0IQ2IDCT1IDCT4IDCT6IDCT9
Core 3 419~10291029~16391639~39123912~45224522~67956795~90689068~1134111341~13614








---------------------------我是20090401分隔線----------------------------




今天報的是有關IBM所開發的Accelerated FrameWork(ALF)




附上投影片




---------------------------我是20090408分隔線----------------------------




今天提出兩個問題,其中之一已能妥善解決,以下描述我遇到的問題。




1. 初始化中,Race Condition的問題。解決方式:使用PPE做主端控制,將控制權依順序交給各個SPE做初始化。同時間只有一個SPE能做寫入的動作。這樣雖然初始化會慢了一點點,但是卻能不用變更到現層的架構所提出的方法。




2. 遇到架構上的缺限,scheduler所產生的排程,應用在core與core之間的channel對應會有問題存在。




目前先寫論文,目前要兩步驟方式,




第一 產生scheduler圖




第二 檢查schduler圖可否產生code,可以的話gen code。




---------------------------我是20090414分隔線----------------------------




解決conflict的問題。Future work: 當candidate list為空的時候,找尋workload此少的core去assign。




數據看起來不make sense,目前要固定某種變量,看數據跑出來的狀況。




1. 為什麼相同Duplication, 比較多Core卻較差




2. 為什麼相同Core, 比較多Duplicatoin卻較差。




是不是因為Queue SIZE未達到最佳的臨界點。




我目前打算產生兩樣數據




1. 固定每一個core的Queue Size,測出數據圖。




2. 紀錄每張圖的最佳Queue size是多大。




---------------------------我是20090429分隔線----------------------------




老師的comment




1. 更改演算法,讓4core在1個duplication下的時間能比3core在1個duplication的時間少




2. 產生出來的數據有多點疑問,必須一一釐清




2.1 Estimate的時間怎麼會比Real跑出來的還慢?必需再去確認這方面的code有沒有錯,還有就是Estimate的時間要再精確點,例如使用SystemC去model整個執行環境。




3. codeGen有一些bug存在,必須把它解掉




4. mplayer那部份的code要重寫,整合Eclipse IDE部份




5.列出論文大綱




第3,4,5點的部份我會先把它做掉,之後再從第1、2點開始解。







---------------------------我是20090512分隔線----------------------------










根據這張圖,老師的疑問說,為什麼4core在1個duplication會比3core的執行時間長。




我們更改程式分配行為,每一顆core上有兩種時間,一種是current time,另一種是workload time。workload time本來是紀錄是此核心上的所有的Task的時間總和。我們現在加上idle time。current time是目前該核心的時間。我們是根據最小的workload來分配Task。



此圖是更改後。


老師的comment,解釋3,4core在1個duplication的時間為什麼會一樣,5,6core為什麼在1個duplication的時間會一樣,而且會比3,4core好。


解釋1. 4 core的執行時間會一樣,是因為task的之間有dependency的關係。如IDCT0要等到IQ0做完才可做,所以雖然多了一顆核心,但是最長的執行時間仍然坐落在做IDCT0與IMC0的核心上。


解釋2. 5,6 core的執行時間會一樣,是因為在1個duplication的狀況下,Task有5個,所以剛好可以分配給五個core。但是多了一顆core其實是沒有做事的。


小新的問題:為什麼4,5core同樣的Estart Time,5core卻會比較好?


解釋 5core在1個duplication的狀況下會比4core好,是因為剛好每一個task都分配給一個核心做。而沒有dependency的Task,可以自由的先執行,例如VLD1不用等IMC0執行完才做,所以這樣的時間就會重疊起來。所以執行時間是該核心最後一個task的結束時間減去第一個Task開始的時間。


小新的問題: duplication的名詞有點怪,以為是要等到1個Macroblck都做完才能輪到下個Macroblock做。


阿拉給我的旨意: 想辦法取每一個Module的最佳的程式時間,但分配用的是平均時間。




-------------------------------------------------------------------------------------------

將程式部份的名稱改的好看

函式名稱有個DB代表使用Double Buffer機制

DB_funName(para1,para2,para3)

para1用來表示channel是跟誰建立的,如圖中的C_SPE0

表示我是當Consumer,SPE0是Producer。我要接收從SPE0傳遞過來的資料。

ToSPE3(para1,para2,para3);

To後方接的名稱代表我要將計算完的資料重送到哪一個core,例如SPE3。

如果是要傳送給做IMC的core,因為我們使用角色互換的trick。

所以它不是固定給哪個core做,這裡我們使用ToIMC傳遞參數

這個函式會幫我們判斷OutputSel是0或1的時候要送給哪一個Core。

我們的CodeGenerator要寫的適合各種case的話

必須讓User設定很多參數,例如要讓這些code執行多少次,要使用的Function是input、output是什麼。

所以我們原先的使用方式是我們先將程式改成可以Codegen的格式,再來寫code generator

而目前沒有辦法做到任何case都可以適用,最大的問題也許是角色互換的那個trick。

再來就是我們要幫它們的module function 建立Double Buffer機制、然後傳遞資料時要有TAG的資訊,TAG不能都用一樣的,因為會有效率上的問題。

期待學弟了解這些機制後和寫法後能夠改善。

31 則留言:

SCREAMLab 提到...

請你把要寫的paper的大綱與每一個section要放什麼post出來一下.

也請Aaa把你自己要寫的部分說一下.

Zhong-Ho Chen 提到...

我先寫 1-1, 1-2, 1-5, 1-6
Abstract跟Contribution等其它部份完成再寫

逼逼逼 提到...

Cell核心視頻編輯加速卡發售 性能實測
http://www.hd.club.tw/thread-16492-1-1.html

Zhong-Ho Chen 提到...

老師昨天才寄信給我...
2009麗臺高運算處理產品教育課程
2009年3月9.10.11日

匿名 提到...

加油! 這是你列的大綱嗎?

有要把塞公的tool與阿凡讀的cell simulator加進去嗎?

逼逼逼 提到...

我原有意是想寫Cell Simulator,不過光只有教安裝的部份稍嫌weak... 我想知道它怎麼測效能,教User寫test program。
不過阿凡現在已經沒在弄Cell Simulator,所以要寫這部份的話,可能要等我有時間自己去找資料,然後試試看可不可以work。

然後塞公自己寫的工具這部份,可放也可不放。目前比較想請他去看的是Cell SDK3.0中,還有哪些工具可以安裝使用,例如Eclipse IDE,XLC compiler等等...

SCREAMLab 提到...

請不要用進度報告一詞當標題, 誰知道你講什麼?


這張scheduler的圖很不錯, 昨天要是看到了會方便討論多了. 我想請教一下就是根據這張表產生的code是嵌到component裡面一起compile嗎? 過去我們應該是根據data flow或status來決定此一component是否要被執行, 這樣的做法可以制式化後, 決定component因為哪些參數而在何時會被叫起來...等等, 然後提出來再討論嗎?

此外, 我贊成將queue的比重減少, 而每一種傳輸方式請付範例.

可以增加第八章為範例區嗎?

我何時可以看到書的動工? 我在想再不動手寫, 你會趕不及畢業.

你要我再去 STC問一下他們要不要人嗎? 我指的是一般正職, 而不是馬上就業那種?

SCREAMLab 提到...

喔!我同意增加一些如你所說tools, 我們自己的tools現在不忙放上去.

你要跟塞公講還是我來講?

逼逼逼 提到...

0. 標題已修正
1. tool方面我已經請塞公看了。
2. 應該是說,根據這張圖就可以知道這個component要做些什麼事,之後就是一直循環在執行。
3. 第八章我想應該不用特別標範例,因為我計畫每講一個章節段落就會有段小程式,所以應該是不用特別有一章是範例區。
4. 書的動工會再找時間寫,目前還是都把時間花在弄codegen。還有好像也應該要準備寫畢業論文了。我會盡量弄...

匿名 提到...

書的部分, 請將要給塞公寫的部分先分出來, 他就可以開始了, 不要再拖了.

另外就是擬的東西未來應該需要像eclipse的環境, 其實這會跟SLIM或OpenESL類似, 我再想要找學地開始porting SLIM, 要不要一起想這件事, 你要是能有規格, 就順便.

逼逼逼 提到...

書的部份我已經跟塞公說了。
動工則是前三天就開始寫了,可惜比爾蓋茲好像不想讓我寫的樣子。我寫了三頁Word就強制關閉了,我什麼檔案也沒留下 orz

SCREAMLab 提到...

請與學弟開一個新串, 開始放書的進度與內容上來.

感謝!

逼逼逼 提到...

已開討論串
http://screamlab-ncku-2008.blogspot.com/2009/03/multi-core-programming-on-playstaion3.html

SCREAMLab 提到...

修正一下.

第二點是假如學妹可以把IDCT改好, 請你不要自己做, watch一下學妹的狀況就好.

第三點我再看看, 可能不要用codec, 你有其他建議嗎?

我加一點, 這樣的做法可以跨平台嗎? 舉例, 要到NOC, multi-ARM上, 或 甚至只是X86 Quad上.

逼逼逼 提到...

1. 我想這一兩天會跟阿凡討論,然後會另開一個討論串來討論GUI的事。
2. 我會詳細回答學妹的問題,至於進度的快我想還是由學妹拿捏會比較好,或是老師心中如果有進度表的話,我們可以討論一下。
3. 我沒有特別的建議耶,codec也許可以,只是不知道能力是否能及。我的建議是找個短的例子不如找個好的人,這個人非常了解這份codec的流程和程式碼,然後哪邊可以有效率的平行化,這應該是相對該受到重視的。當然如果老師只是想找個人負責把程式碼交給我,那就沒多大的差別啦 XD
4. 我想應該可以跨平台,至少在x86 Quad應該不難,只要依照各平台的特性,抽換溝通的底層(channel),和上層分配Thread到每一個core。

SCREAMLab 提到...

可以問一下甚麼是:

ALF與DACS

SCREAMLab 提到...

排程可以有一個flowchart或algorithm來展現嗎? 用一個Empirical的方式來寫不太像論文該有的樣子.

逼逼逼 提到...

沒看到老師的回應,如何排程是個演算阿,不是經驗

D. N. A. 提到...

BBB! 跟你說 我看了一下

你這個問題正好是標準的Minimum Job Scheduling Problem

Which is classified NP-Hard

但是有一些現成的approximation的algorithm可以用 參考看看唄

google: Job Scheduling approximate NP-hard

逼逼逼 提到...

thanks 我再去找找

SCREAMLab 提到...

1. 你在排程時有沒有將Idle放進去當cost呢? 假如沒有, 那就會有一點問題.

2. 這類的問題我們會希望少的core是多個core的subset, 所以出現多個core反而要執行更多時間是不合理的, 會被抓包的. 口試實很難自圓其說.

3. 更改演算法的目的是合理化結果, 我一值覺得這是一個很classic的問題, 如DNA所說, 應該可以找到現成的程式.

Buffett 提到...

"少的core是多個core的subset, 所以出現多個core反而要執行更多時間是不合理的"
這句話好像感覺要有些前提吧
例如說core跟core之前的溝通是完全對稱的(即cost是一樣的)
如果有的core跟另一個core的資料傳遞速度比較慢,那就無法達成這樣的要求了
印象中PS3中,好像會有這種狀況,不知道會不會影響
(純推測...)

Zhong-Ho Chen 提到...

首先, 這個問題一點也不classic!
和一般Job Scheduling的差別
1. Task之間有dependance
2. Task不能隨便配給任一Core (Resource contention)
3. Task有Interation
目前沒看到標準解法, 比較像的解法就是Software Pipeline, 但也不能直接套
目前的解法就是修改過的Software Pipeline, 但是碰到了BBB講的這些問題
無論如何, 結果一定要合理

SCREAMLab 提到...

sorry, 我孤陋寡聞, 我一值以為這種排程用graph或tree searching是一個人加研究過的問題.

可以證明這是NP complete or NP hard嗎?

Keiko 提到...

嗚嗚,我也孤陋寡聞!也可以試試看 Job Shop Scheduling 這個關鍵字,下面是 wiki 偷來的,
Many variations of the problem exist, which can be summarized as follows:

* Machines can be related, independent, equal
* Machines can require a certain gap between jobs
* Machines can have sequence dependent setups
* Objective function can be to minimize the makespan, the Lp norm, etc
* Jobs may have constraints, for example a job i needs to finish before job j can be started
* Jobs and machines have mutual constraints, for example, certain jobs can be scheduled on some machines only

Zhong-Ho Chen 提到...

我也孤陋寡聞, 周大師的關鍵字太神了
中文Review 解法有: 分枝界限法, 優先規則法, 移動瓶頸啟發法, 模擬退火法, 禁忌搜尋法, 遺傳演算法
再加上上面講的 variations
有任何一個都可以發一篇paper = =
我們有好幾個.... BBB唸博班吧

逼逼逼 提到...

阿,我的IE似乎中了毒,似乎看到某些關鍵字就會跳出,莫非台灣也有了金盾?

Buffett 提到...

我覺得你比較想土遁哩

87showmin 提到...

我有朋友曾丟篇論文給我,是用模擬退火法解交通阻塞問題耶,非常適合現在正在學開車的人去研究一下。

SCREAMLab 提到...

ㄟ! 我沒那樣講吧!!!

逼逼逼 提到...

哈 已修正