2009年1月20日 星期二

進度報告-Cell BE programming-塞公



報告一下我這禮拜看的DMA list

mbox ppe 部份測試只測了一些 進度有點慢

投影片在此

------------------12/08----------------------------


這禮拜主要是在寫程式碼部分


試著寫電腦音樂期末作業的程式架構


與已經將ps3灌好 並拍照存證





投影片在此


------------------12/15----------------------------


將 PPE 與 SPE 和 SPE 與 SPE 之間的 mail box 和 signal 傳輸

寫完並記錄

投影片在此

------------------2009/01/20----------------------------


將進度更新一下 離上一次更新日期看了都感到汗顏

主要是把進度做到一個段落了

有要做的部分大致上都有一些成果

這次投影片也是這禮拜二期末報告要用的(部分頁數)

投影片在此

2009年1月19日 星期一

ABS/OLA Sinusoidal Modeling

這篇全名為Analysis-by-Synthesis/Overlap-Add Sinusoidal Modeling Applied to the Analysis and Synthesis of Musical Tones,是1992年AES的Journal,主要精神在於Analysis-by-Synthesis,概念其實跟 codec 的 encoder 內部包 decoder 很像,它每一圈都會找一個新的 Sinusoid並加入,以致於原訊號扣掉這些Sinusoids後會最小,最後再依照這些Sinusoids來分析下次要找的參數。

image



本週我報告了ABS流程及公式推導,老師提出了一個問題。

在計算 least square error 時,ω 如果照 paper 上說的只是將每個frequency bin代進去看誰最小,這個動作不就跟做DFT一樣?如果該訊號的頻率介於兩個bin之間又該如何?

論文 p501 第(25)式說明他是用每個bin代進去算的,後面我還沒報告的部份裡有另一個主要觀念 Quasi-Harmonic Modeling 則只有調整 partials 的位置,但前題是 f0 要找得準,其他部份要全部看懂後才能確定它是否沒做特殊處理。

而老師提出一個解決此問題的方向…

image

既然公式中原本只對 a 跟 b 做微分取極值,我們可以對 cos(ωn) 與 sin(ωn) 先做 Taylor expansion 後對ω做微分取極值,極值不只一個解,先前我們可以知道ω落在哪些bin之間,以此做判斷選出正確的極值即可。

Download:  paper  slide

Dec. 9th. 2008 update

上次提到「ω 如果照 paper 上說的只是將每個frequency bin代進去看誰最小,這個動作不就跟做DFT一樣?」的問題,其實在論文上有說明 M 值可自訂,M 值 & Na(Analysis frame size) 與 SNR 的關係可在投影片上看到。之前之所以誤會成是 frame size 是因為 M 同時也是 DFT 的慣用標號,論文第三章的實作說明中只有一小句話有提到原始訊號轉 DFT 前需先 zero padding 到 M 的大小。

Download:  slide

Jan. 6th. 2009 update

今天回報已解決bugs及目前遇到的問題。投影片中有列出 4 個case,接下來打算先針對第二個case去找問題所在,這是沒有套用windows function,但FFT size有加長的結果,很明顯phase跑掉了。

image

Download:  slide

Jan. 13th. 2009 update

由於 revise 原本論文的算式已找不出錯誤,某天我翻出同作者在五年後發的另一篇論文:Speech Analysis/Synthesis and Modification Using an Analysis-by-Synthesis/Overlap-Add Sinusoidal Model,雖然這兩篇論文內容極為相似,不過我發現有部份算式不一樣,舊論文在推導MSE時使用

image

image

新論文則是用

image

換了新論文的算式,套上pure sine後結果很正確 (case 4-4),很開心的套用到 violin 第一個frame也正確,但跑到第四個frame時便找錯頻率了 (case 4-5)。也因為如此,找出了另一個主要問題。

論文在反推phase時是用 -arctan(bi/ai),這是因為公式的推導中會出現 sinφ/cosφ,但是,原本φ的範圍是介於 0~2π,arctan的結果卻只會落在 +-0.5π,導致當我們用 cos 去製造 sinusoids 時,phase的平移範圍太小,當這個frame起始的幾個samples值是呈現遞減趨勢時,phase的誤差會剛好差π。解決的辦法就是改用 Matlab 的 angle function。(case 4-6)

最後,實驗結果還是有phase的偏移,所以開始針對phase再開新的case來討論。目前的問題出在:在找第一個 sin 時是正確的,找第二個時 phase 便會出錯,可參考 case 5-2,第一個 sin 的frequency index落在 14, 15, 16,第二個在 17, 18, 19。中間的圖說明能量上跟原訊號是很完美的貼近,但下圖的 phase 卻跑掉,導致上圖的波形有所差異。

image

Download:  slide

2009年1月18日 星期日

2008畢業照

2008年, 我教的這屆學生要畢業, 其實我自這屆以後, 大學部我開的都是選修課, 所以跟學生的關係不再似以前一樣密切, 不過我在每屆學生畢業照之時, 一定會抽空參加.

DSC01122



這系的老師不知怎地, 不太參加學生的活動, 甚至連畢業照show up的老師也不多. 師生的關係疏離嚴重. 我想跟老師的研究升等壓力超大有關吧! 也怪不得老師們, 我見到系上的新老師通常來不到一年, 其氣色與健康就走下坡的很多, 這也令人憂心. 教育事業走到這一步, 不知道該怪誰, 不知道該怎麼說與怎麼辦?

話說2008畢業照, 一班在星期五 , 另一班竟然定在星期六, 星期五參加的人都少了, 星期六一定更慘. 我是周末一定要陪家人的, 何況內人星期六到北部開會, 留我一個人要搞定兩個孩子, 出門對我來說簡直是恐怖與不可能的任務. 所以我只答應星期五出現, 星期六的就抱歉了.

沒想到我星期五的時間記錯了, 一點記成兩點, 等跑到圖書館錢已經曲終人散, 沒辦法, 我又不想缺席任一屆的畢業照, 星期六上午硬著頭皮出門.

出門前先幫Diane與Joanne洗一下屁屁, 10點開始餵午餐, 10點45分出門. 10點55分到學校. 11點多一點與學生會合.

大家可以想像到學生驚訝驚喜的樣子, 因為我事前沒說, 而當天也確實沒其他老師出席, 學生失望之極可想而知, 但是突然有一個老師出現, 心情可想而知, 何況還多了兩個如花似玉的小女生.

所以大家爭相跟我們三人拍照, 可惜我家Diane靦腆到家了, 所以一直沒太多笑容, 但是學生的滿足我可以感受到. 我想這會是我以及這一屆學生永生難忘的畢業照.

真的, 其實做老師的多用一點心, 事情總是會不一樣, 就像這2008的搞笑畢業照一樣.

其實我的心裡面也多少帶著一點心酸.

DSC01121

這是我跟我的專題生的合照. Diane跟Joanne在拍照後, 我待開他們後就開始恢復頑皮了, 玩得起勁得很, 挖勒! 一直玩到下午三點半才回家. 除了他們高興之外, 我也真的佩服自己.

DSC01120

DSC01128

DSC01130

DSC01133

DSC01129

DSC01132

一個字, 猛啦!  ㄟ! 我是說Diane跟Joanne很猛, 不是我啦.

那天 !我累癱了.

進度報告 - Simulator

08/11/17
投影片









這禮拜survey的主題是IBM Full-System Simulator
主要是根據[Performance Analysis with the Full-System Simulator]這一份document來報告
同時參考了[IBM Full-System Simulator User's Guide]
[Using Systemsim to Guide Application Transformation and Tuning for the Cell Broadband Engine]

前兩份是Systemsim 3.1的內附文件(但內容是依照3.0版寫的)
第三份是來自IBM Austin Research Laboratory的投影片(Systemsim 1.1.1版)
後面附了兩個龐大的例子,可是一堆程式碼也沒說要放在哪裡用,
暫時我還參不透

這禮拜花了太多時間在安裝systemsim上面
我現在安裝的是Fedora 9搭SDK 3.1
網路上查到的大多是Fedora7搭SDK3.0
照理說SDK 3.1也發行半年了 應該沒什麼問題才是
可是我裝到最後 command line可以用 但GUI就出不來
具體的說 是出現一個空視窗 該有的樹狀目錄跟按鈕全都不見蹤影
好像是BLT的問題 可是BLT的版本又是對的
cellsdk verify的結果也是該裝的RPM都裝了
不知道是哪裡出了錯 論壇裡有人碰到了跟我一模一樣的問題
(11/9發的 至今還沒有回應)
http://www.ibm.com/developerworks/forums/thread.jspa?messageID=14163015

在我硬是重裝BLT後
錯誤訊息變成了Segmentation fault on address 0x8 更糟
所以 這禮拜還會再花一點時間試試看
如果我能搞定的話 再把安裝過程貼上來

不過就算安裝成功 也只是看到simulation的結果
對於它內部是如何模擬CBE架構 取出要trace的資料 還是沒有什麼概念

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

08/11/19
這兩天試的結果 在原本的安裝步驟後
"再"install tcl跟blt一次 然後ulimit -s unlimited
這樣 gui就可以成功出現 但關閉時仍會有[程式記憶體區段錯誤]的訊息
(在兩台不同的電腦都是相同情況)










BUT 只有在一個BE的時候OK 如果執行[開兩個BE]的tcl檔
那出來的GUI還是一樣是空視窗 沒有目錄及按鈕
這樣的狀況 目前還沒有查到解法

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

08/12/01
這禮拜跟學長討論一下 要怎麼開始寫程式
因為有cross-compilation的問題 所以我得先研究一下ELF的格式
這裡是我這次的投影片
內容不多 只是講ELF的結構

關於IBM simulator 因為這禮拜都在趕作業
沒有繼續去查simulation的cycle mode為什麼跑不起來
不過 我發現 simulation開fast或simple mode
SPU的pipeline mode 是可以跑的
可以看到詳細的statistics跟visualization的圖表 只是時間恐怕不準
(要產生數據資料SPU必須開pipeline mode
時間要準simulation還是得要cycle mode)
我還要再研究一下它那些mode之間的關係

另外 開始寫simulator的文件了
目前只有[安裝]跟[上上禮拜的啟動與載入程式]
雖然使用上還有很多東西沒搞懂
可是不先寫下來我怕以後全都忘記了
這禮拜的進度就是這些
--------------------------------------------------------------------
--------------------------------------------------------------------
08/12/03
昨天上課的時候 老師有提出一個問題
「為什麼要自己寫simulator 不拿現成的QEMU來改」
我問過學長後 是因為QEMU有support整個linux 比較複雜
而且QEMU並不支援cycle 不符合我們的需求
然後 因為距離期末時間只剩6周
學長也訂了這樣的時間表
week1 弄懂instruction
week2~3 簡單版 simulator
week4 簡單版 multi-core
week5~6 快速版 multicore

我想說 在這邊昭告天下 也許我會寫的快一點吧
剩下的就是對自己的期許了...
不能被別的lab比下去捏
(ps.楊中平教授果然是很嚴謹的教授呢 讓我有些招架不住)
--------------------------------------------------------------------
--------------------------------------------------------------------
08/12/22
這禮拜剛完成一個core的instruction set simulator
(說穿了只是有實做memory的disassembler而已)
  • 指定要讀的程式(ELF檔)
  • fetch指令(同時load text, data 進記憶體)
  • 利用迴圈一次執行一個指令
就這樣 這幾個禮拜花了太多時間在指標跟記憶體位址的關係上
前天還連續寫了10個鐘頭卻沒有進展 =.=
現在有一點概念了 不怕
現在再研究多個core的時候 在執行時的同步問題
現在...應該是各個core有自己的instruction memory
可是在執行時會參考到同一個data memory
當大家都讀/寫同一個地方時 會有資料的一致性問題
(還是該稱作race condition問題)
(這是我在想啦 還不是很有概念)
所以說以後要跑的程式 在寫的時候就該指定好要給哪幾個core去跑
在編譯時就針對各個core各自編指令囉
然後就是各個core之間的同步 讓最後記憶體裡能有正確的結果
應該是這樣吧
這禮拜要研究的就是 上面說的那些 要怎麼去實現...
(時間還剩三個禮拜 應該是來得及吧)
--------------------------------------------------------------------
--------------------------------------------------------------------

09/01/19
一下子 三個禮拜就過去 前一篇已經是去年的事了
轉眼間已經是期末
所以即使做的不好也要有個階段性的ending了
結果是來不及加速 只能做到多個core分享資料而已
這一次的投影片內容
是個很簡單的multicore simulator實作
懶得看投影片的人不用怕 我也把大致的內容寫在下面
(可是欄寬真的太窄 所以一直換行 請見諒)
架構:
一共有5個core
core0 負責做同步的動作
程式中運算的部分則交給core1~4負責
每個core有自己的local storage

可直接讀寫自己的LS
每個core還需搭配一個mfc

在core之間傳遞資料必須透過mfc來完成
給我換行!!! 為什麼要一直縮回去!!
功能:
範例程式[矩陣相乘]
運算結果為一4x5的矩陣

在程式中宣告4個大小為5的陣列
並指定core1~4分別算出第1~4列
存入對應的陣列中
(core1 計算第一列 存入陣列1中)
同時 在程式中宣告4個flag 分別對應core1~4
當core1~4計算出結果後

呼叫mfc_put(core_id, address, size)函式
以通知core0
並將運算結果傳給core0

製作:
程式中包含[elffile], [disasm],
[core], [mem], [mfc], [bus] 6個class
主程式中宣告1個bus及5個core
並將bus指標丟進core中

在每個core的初始化中
// 將LS傳入共用的bus中
//讓bus可以看見所有的LS
bus->mapping(core_id, mem);
你也是~ 換行!!!!!
// 將LS及共用的bus傳入
// 以設定mfc可透過bus來存取別人的LS
mfc = new Mfc(mem, bus);
([bus]內含5個[mem]指標)
([mfc]內含1個[mem]及1個[bus]指標)
c程式經過compile後產生elf執行檔 由[elffile]解讀
再將instuction及data載入[core]的[mem]中
執行到呼叫mfc_put(core_id, address, size)指令時
從stack中抓出所傳的參數
再依這些參數指揮MFC做對應的動作
這樣就能在不同core之間傳資料了
--
(補遺)
換行!!
補上前一個禮拜的內容
架構上是一樣的 但是實現方式不同
我原本是想說 application那邊沒辦法告訴core
"何時"且"如何"存取別人的Local Storage
你為什麼不換行
所以讓每個core(硬體)自己handle一個flag
表示所載入的instruction是否已執行完
再讓core0去其他core那邊拿資料
當然 如何取得資料還是一個問題
但因此core變成"主動"去別人那邊存取
而不是單純的執行instruction
讓我空一行是會怎樣
像這樣的同步動作 不該是硬體在做
core負責的只是讀指令並一行一行的執行
core並不知道自己在幹嘛
flag的維護及同步動作的執行
應該是programmer的任務 在application那邊做好
會佔去你伺服器很多空間嘛??
至於要傳入MFC的記憶體位址要如何取得
是問過學長之後 才知道這個辦法
在application端加入一個空白function (mfc_put)
在執行到 call mfc_put 之前 會先將參數存進stack
又因為每個core拿到的是同一個執行檔
有相同的變數 所分配到的記憶體位址也相同
MFC access所需的來源位址跟目標位址
用同一個變數的位址就好
這樣就可達到"在application端做同步"的目的了
--
simulator :
模擬出硬體環境包括core、MFC、bus...等,訂出各元件的溝通機制。
core :
單純的依照目前的PC值讀出instruction並執行對應的動作,至於程式執行到哪了,是否執行到最後一行程式了...這些,core通通不知道。
application :
要用到幾個core、每個core要做什麼事、core之間如何做同步...等,都是由application決定。所謂"資料是否同步"只對application有意義。