2010年3月1日 星期一

System Architecture of ManyCore Simulatorn - 鈞/阿凡/宗胤/品皓

--- 2010/03/01 01:00PM ---

以下是 Y凡的意見,先將其放入主文。我在回應的地方後面有加一些意見。

-----------------------------------
關於core之間的通訊協定部分
我想參考TCP通訊協定,實做這些部分來達傳輸的可靠性,只是不知道這樣做對傳輸效率會有多大的影響

封包中主要定義"來源位址"、"目標位址"、"封包大小"、"剩餘window大小"、"資料sequence"、"偵錯資訊"及"要傳送的資料"

封包的遺失與重傳
設定一個delay time,當收方在收到封包後,送出ack給送方。
而送方在送出封包後,,開始計時,若在delay time前沒收到ack,就自動重送封包
根據收到ack的時間來動態的調整delay time

window advertisement
收送方兩端都約好一個空間大小作資料暫存,在傳送封包及ack時告知對方次空間的大小,當空間已滿時暫停傳送

3-way handshake
利用synchronization segment來建立連線,finish segment來終止連線

congestion control
送方送出封包收到ack後,即將資料傳輸量加倍,直到傳輸量達到收方的window size的一半為止

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


--- 2009/12/02 06:40PM ---

實作方向

1. Using standard ANSI C to implement the loader's functions of processors(Cores) , so they can be cross-compiled to others binary code to run on different core architectures.

2. The Network-Interface and Router's functions are builded by SystemC. They simply do the function of exchanging data between processors(Cores) and Host.
3. The Network implementation should be easy replaced to the Network architecture, using in 8051 CPU, which suggested by 宗胤 today(2009/12/2).

Network Architecture(按我下載)





--- 2009/12/02 10:07AM ---

Function list of Host loader

1. Initialize all Processors, include the stack region size, data
region size, number of code region , code region size.
2. Decide and Partion the Stack size, Data size, and function Code size according the Tasks of the Job.
3. Schedule the tasks of the job according the resource of multicore System.
4. Dispatch Data and tasks to Processor.
5. Infor Processor to execute a task.
6. Sync the task between all processor.
7. Deal with all errors and status of the
multicore System.
8. Collect all the data from Processors and Finalize the Job.


Function list of Processor loader
1. Initialize the stack region size, data region size, number of code region , code region size.
2. Place the Code and Data to their local memory region.

3. Wait the command from Host to execute the code on code region.
4. Pass the data to next processor.
5. Pass the status to next processor.
6. Return data to Host.
7. Return status to Host.




--- 2009/12/01 ---

依據昨日晚上與今日下午與阿凡/宗胤/品皓討論出來的API架構

阿凡整理的API架構Word檔案(按此下載)

*********** 以下是直接節錄阿凡整理的檔案內容 ********
一開始在initial的動作中,會先將整個code與data分成幾段,並且知道每一段的大小,決定好每一個processor要執行哪些code,用到哪些code。

memory中包含幾個code region、幾個data region,以及這些region各自的起始位址及大小,每個processor會維護一個資料結構來存這些資訊。


HOST端
1.InitializeProcessor(ProcessorNo, Information)
將初始化資訊Information傳給指定的processor
2.DispatchCodeToProcessor(ProcessorNo, CodeNo , CodeRegionNo)
將指定的code傳遞至指定的processor的指定code region
3.StartExeCode(ProcessorNo, CodeRegionNo, RelativeStartEXEAddress)
processor開始執行指定位址的程式碼
4.DispatchDataToProcessor(ProcessorNo, DataNo, DataRegionNo)
將指定的data傳遞至指定的processor的指定data region
5.GetDataFromProcessor(ProcessorNo, DataRegionNo)
從指定的processor的指定data region取回資料
6. GetInformationFromProcessor(ProcessorNo, struct Information *)
從指定的processor取回region資訊
7.GetStatusFromProcessor(ProcessorNo, struct Status *)
從指定的processor取回Status資訊
8.定義region資訊
struct Information {
ProcessorNO; // 自己的processor號碼
NumOfCodeRegion; // CodeRegion數量
Struct CodeRegion *;
NumOfDataRegion; // DataRegion數量
Struct DataRegion *;
StackSize;
}
struct CodeRegion {
CodeNo;
CodeSize;
}
struct DataRegion {
DataNo;
DataSize;
}
9.定義status資訊
struct Status {
StatusNo;
}

Processor 端
1.Initialize(Information)
依照Information做初始化
2.ExeCode(CodeRegionNo)
執行指定code region裡的程式
3.InfoHost()
主動通知host,回傳Status
4.InfoProcessor(ProcessorNo, DataNo, DataRegionNo)
主動通知processor,回傳Status
5.SendDataToHost(DataRegionNo)
將指定data region裡的資料傳回host
6.SendDataToProcessor(ProcessorNo, DataNo, DataRegionNo)
將指定的data傳遞至指定的processor的指定data region
7.GetDataFromProcessor(ProcessorNo)
將指定的data傳遞至指定的processor的指定data region

Cloud Computing API
1.HostToProcesssor(Host, ProcessorNo, Data *)
2.ProcessorToHost(Host, ProcessorNo, Data *)
3.ProcesssorToProcesssor(ProcessorNo, ProcessorNo, Data *)




--- 2009/11/26 ---

補充一下昨日課堂上老師談論的一些資料

1. 系統的走向不以HPC為目標,但需兼顧日後的cores角色替換方便性。

2. 擔任cores的角色可以是硬體也可以是軟體。因此,它可以是arm base或8051或Sparc或x86等任一架構。

3. cores的任務很單純,就是接受host指示,執行由host送來的binary code。而且以single thread方式執行,但是其local memory可能同時間存放好幾套不同function的task的binary code,可以方便某一task執行完畢之後,切換至另一個task。

4. host 則是擔任資源與task分配的運籌中心角色。

5. 介於host與cores的網路,則以搭配的cores來對應軟硬體。可以是bus/ring等型式。



--- 2009/11/19 ---

依老師昨日所提,我大概畫了一下系統架構圖,如果有出入,請指正。
系統架構圖word檔案(按此下載)




至於所需的API,我先提出我想到的部分。

HOST Scheduler API
1. EXECodeToProcessor(ProcessorNo, CodeNo, CodeSize, CodeBlockNo )
2. ReplaceCodeFromProcessor((ProcessorNo, CodeNo)
3. DataToProcessor(ProcessorNo, DataNo, DataSize, DataBlockNo)
4. DataFromProcessor(ProcessorNo, DataNo, DataSize, DataBlockNo)
5. GetInformationFromProcessor(ProcessorNo, struct Information *)
6. struct Information {
ProcessorNO;
NumOfCodeBlock;
Struct CodeBlock *;
NumOfDataBlock;
Struct CodeBlock *;
}

Processor API
1. ExeCode(CodeBlockNo)
2. DataToHost(DataBlockNo)

Cloud Computing API
1. HostToProcesssor(Host, ProcessorNo, Data *)
2. ProcessorToHost(Host, ProcessorNo, Data *)

31 則留言:

SCREAMLab 提到...

大鈞與品皓好:

以下是我給在NY的YL的回應, 請有問題可以多跟他討論. 我想一下, 既然是做高速平行運算, 用高階一點的CPU好像比較對. 至於ARM/X86, 就拿來做I/O吧!


YL:

我有點想要用Sparc or 64-bit Sparc來Build我們的系統. 我的目標不是像我老師一樣porting整個Sparc V8的system.而只是希望將Sparc當做一個計算單元來使用, 不必有I/O, 只需要跟 Bus or NOC有接起來, 以及有Local記憶體裝置即可. 我想做的你可以從大鈞剛放上去的串略知一二.

http://screamlab-ncku-2008.blogspot.com/2009/11/h264-simulator-system-architecture.html

所以我只需要porting部分東西, 當然我們會需要compiler, GDB debugger等一班tool chain. 我想知道進一步的GrMon的做法, 假如可以, 我希望自己在ESL這邊自己做一套, 雖然最近我跟AAA都agree, Many Core的程式最好不需要花力氣去debug core與core之間的問題, 這樣, bug就被侷限在單一core上就好.

假如他們有SystemC model最好, 要不然, 我只好用FPGA了. 最近, 我是在規畫做一套像BEE一樣的東西, 而大鈞的project要做的是SW為主, 模擬為輔.

歡迎有問題上來討論. 另外我可以每天有一段時間可以跟你MSN嗎? 一方面想了解你幫我老師的進度與做法, 希望我也可以貢獻一點東西.

yl 提到...

這兒也沒有要porting整個系統, 他們主要也只是要CPU and NoC.至於老師提的tool chain兩家都有提供, LEON3 還有simulator(multi-core). but I guess the simulator only can verify functionality of software. GRMon的做法是透過AHB去控制DSU, 然後讀取processor的register而已, 不要把它想的太複雜了. AS for multi-core debugging, I don't think it provide more utilities.
OpenSparc看起來不錯, 用這個弄得好, 他們還可以給你拍拍手, 讓你變成OpenSPARC Centers of Excellence, 不過, 因為沒有看過所有文件, 不知道tool chain及使用情況如何. opensparc simulator:http://www.opensparc.net/pubs/preszo/09/brussels/06_SM_OpenSPARC_Simulators.pdf

yl 提到...

順便提一下, 今天下午去聽一個老奶奶的的演講: Frances Allen, 題目是: The Challenge of the MultiCores.
但技術內容並沒有很多, 不過有提到幾點看法, 最重要的一點是multicores對CS而言是個很大且很新的挑戰, 再來就是在軟體方面, 就做平行運算上, 現在的軟體工具及設計方式是缺乏的, 所以需要高階一點的新語言, 也可能是domain-specific language, 然後平行的方式會跟data及domain有關, 就HW方面而已...有點忘了....比較深刻的一點好像是要移除cache吧. 然後...也跟moore's law 有關..每1.5~2yrs, CPU內的core會增加一倍...

大概是這樣

yl 提到...

有幾個問題想問一下:
1. 此simlator的目標為何?
a.為了測試multicores的SW正確性及debug?
b.提供Performance information?

2. 此simlator是non-SMP系統? 有個master在做Scheduler? 是否可以放OS上去?

3. 所提供的APIs是要給誰呼叫?!
a. 給寫放在simulator裡跑的程式的人?
b. 給發展simulator的人?
c. ???

不過... multicore不是aaa比較懂嗎 @@a.. 我不太懂說 :$

SCREAMLab 提到...

先談技術問題:

我基本上只要OpenSparc可以上FPGA版子, 可以run程式, 可以接上GDB就可以了. 當然GDB是透過USB跟FPGA上的CPU連.
目前品皓在porting 8051GDB上已有進展, 接下來就是把8051 SYstemC Model換成真的FPGA的8051就可以了.

假如GrMon是透過AHB去吃CPU的資訊, 那麼你有辦法黏一個電路上去抓這些出來嗎? 然後要放上AHB或NOC就可以隨便
我們玩了. 至於GDB, 我們還是透過一般的常駐軟體來做, 這樣比較跟一般GDB用法相同.

所以應該只需要向compiler等一般的tool就行了.

以上可以研究一下再回復給我嗎?


至於Multi-core, AAA說就根本不要讓bug發生, 把bug侷限在single core level就成了, 要不要新的Language我不知道也暫時不想做,
不過實驗室的第一步是先讓程式很方便的deploy後正確的run起來再說. 我現在要建的是infra-structure, 也許你們之中有人有一天
會用到他來做研究也說不定.

你對實驗室要做的東西的問題, 我讓大鈞, 宗胤, 或甚至AAA來回答好了. 我現在只能說我要做的事是蓋房子, 可是蓋房子
需要錢, 我的短期目地是建一個環境來找funding, 然後用這funding來把房子蓋好, 至於說房子蓋好後要做什麼? 佛曰: 不可說.
或者說以後再說.

嘿嘿!

yl 提到...

先釐清一件事, GrMon是跟另一個processor-LEON3在一起的... OpenSPARC則是另一個由IBM提供的CPU...它跟GRMon是無關的....

星期一時我有寄一份關於Leon3的投影片,昨天才發現被擋下來了, 我麻煩一輝幫我重送了. 老師可以先瞭解一下

SCREAMLab 提到...

我找時間讀一下.

我想porting Sparc上去 FPGA, 然後形成一個大鈞畫的那個圖的架構. Sparc對我來說只是計算用的, 我想在它的local記憶體加一個通道讓Host可以直接塞程式進去, 然後再由Host通知他去執行, 應該不難吧?

是Leon3的比較容易還是OpenSparc?

我看一下GrMon再來決定DSU部分要怎麼辦才好, 我不喜歡被人家綁住又沒support.

yl 提到...

我翻了一下OpenSparc T1的文件, 基本上它是顆8-cores (SPARC V9)的processor, cores 經由crossbar去連接到on-chip L2 cache及IO, 也就是說core彼此間沒有bus存在. processor內部是用packet-based的方式來傳訊息. crossbar則再透過一個input/output bridge(IOB)去跟外界連接(j-bus/Dram/...). 大部份的東西都不是general bus, 但在T2版, 則是processor最外面有一個pci-e的介面.

老師想做的那件事, LEON3系統上已經可以實現,但它是SMP的系統, LEON3只要付費應該是有support, 不然就是open source system, 當然沒有support :p , 但可以試著寄email問問題, 好像還是會回信哩...

OpenSPARC的話, 就不清楚了.

TITMIS-鈞 提到...

謝謝yl提供的方向與意見。

目前,設計API的方向應該是保持較大的彈性,而且是以方便溝通各個core與host的資源分配與回收為主。應該較類似kernal level。而Host的腳色,會是一個較吃重的資源分配者。短期目標是將設計出來的scheduling method實作看看。

TITMIS-鈞 提到...
作者已經移除這則留言。
SCREAMLab 提到...

那麼Host與Processor上面要不要跑一支常駐程式呢 ?

假如要, 那他們的功能會有哪些呢?

SCREAMLab 提到...

YL:

在OpenSparc上面, 一定要跑OS嗎?

我有一點懷疑是耶! 要不然8個core要如何分配工作與同步呢?

有單核Sparc的Core嗎? Leon3嗎??

TITMIS-鈞 提到...

補充想得到的Function list@Processors and Host

TITMIS-鈞 提到...

事實上,與阿凡討論API時,已基於有loader的概念來找出需要哪些API.

另外,資料交換所需的雲端網路,在實作上是否會受限於processor的硬體?例如好多個8051或不同種類的processor混合?

yl 提到...

之前有花點時間翻一下opensparc spec.
但沒有看到SW相關的issue
不過, 印象中有release 一版single core的
找到再補上

yl 提到...

ok I found it!
In document "OpenSPARCT1_DVGuide.pdf", page 32.
The document is for design and verification. The single core consists of: one SPARC CPU core, Cache, Memory, Crossbar. But it does NOT have an IO subsystem. The details are described in the document.

SCREAMLab 提到...

我想, 這實在不能稱之為雲端.

還有就是架構當然要支援異質核心以及隨連接架構不同而不同.

SCREAMLab 提到...

YL:

那這single core OpenSparc可以坐到我上次跟你說的那個功能嗎?

yl 提到...

我沒有實際弄過, 所以跟老師您的瞭解程度是一樣的"理論上都是可行的" :p

其實拿lab 8051來測很快, 因為我們有現成的tool 可以把code塞進我們想要的位址, 用組語寫個小loop, loop裡面一直check interrupt or 某個reg 再jump就好了.

目前看到這個thread討論的都是比較上層的,尚缺乏接近實作的討論. 像function list of processor loader:

1. Initialize the stack region size, data region size, number of code region , code region size.
==> WHO initialize/define the region?? A tiny OS-like program executed on the core??
2. Place the Code and Data to their local memory region.

==> WHO places these data to memory?! external HW? or the OS-like program?

...

這呼應我之前問的問題: 所提供的APIs是要給誰呼叫?!

TITMIS-鈞 提到...

yl提到的實作可能要面對的問題在一開始設計APIs時並未考慮,因為老師希望能很彈性置換成各種形式的架構。
而至於APIs是提供給誰呼叫,我想一開始如果以loader形式處理cores及host的運作,那應該更接近提供哪些服務來完成整個Job.

另外,yl那邊是否有現成已分好tasks的DAG屬於FFT或類似的信號處理程式,或哪邊可參考?

yl 提到...

我手上沒有這類程式...這邊沒有人在做排程...

SCREAMLab 提到...

YL:

用實驗室的來做當然簡單, 宗胤這個月就會做完SystemC Simulation Model, 品皓要做的事是實作這個多核8051在FPGA上面.

我對用OpenSparc 8-core比較猶豫的原因是因為我不知道是不是需要像一個小OS一樣的東西來schedule jobs給那八個cores. 假如一個core可以boot起來, 再讓他run一個常駐程式來handle jobs, 這是比較不必靠其他人的SW來達到的, 也是我要請你協助的. 我已經請品皓去看simulator與GDB的部分, 看是否有Open source, 然後包成SyetmC Module來用. 也請哲榮跟你contact, 看是否可以先把一個Sparc(最好是OpenSparc的single core, 退求其次是Leon, 但是假如8-core OpenSparc可以給我們像Single core那樣子來玩更好)放到FPGA上面, 然後讓他可以在上面run個小程式.

下星期給我一點你們討論的結果.

另外, 大鈞不是在問schedule好的FFT, 而是有沒有人把FFT平行過後的程式, 這樣大鈞可以trace一下程式後自己來畫DAG, 當然有人劃好的他的DAG是最好的啦!

最後是你的疑問我交給其他同學來回答. 喔! 我指定阿凡來回答好了, 因為他是最迫切要了解這一切的, 弄不清楚的話, 他的論文是做不出來的. 當然歡迎其他人給阿凡意見. 請阿凡在今天post一個想過與分析過的意見出來.

alandai 提到...

Host與Processor上面各自要跑一隻類似loader的程式,來負責初始化、記憶體分配、收送data、processor之間的同步、error處理這些事情,上面所提出的API就是這個loader根據所做的事情而定義出來的。至於這是要提供給誰來作呼叫的,我也還沒搞清楚,只把它當成是Host與Processor所必須具備的功能。把API定義出來,決定好需要哪些參數,底層可以根據不同的硬體架構提供不同的實作。

yl 提到...

我手上沒有平行好的FFT code, 他們做的版本我的理解是沒有根據演算法去平行, 感覺不會比較好?

@阿凡: 保重啦... :p

對了, 為何架構圖中沒有cache/memory??

yl 提到...

update 一些openSPARC的概念:

Single OpenSPARC core supports up to 4 threads !! 這包含hardware resources:
(引用文件)
1. full register file (with eight register windows) per thread
2. most of the address space identifiers (ASI)
3. ancillary state registers (ASR)
4. privileged registers replicated per thread
The four threads share:
1. instruction
2. data caches
3. TLBs

SPARC core pipeline consists of six stage:
1. Fetch
2.Thread Selection
3.Decode
4.Execute
5.Memory
6.WriteBack
注意到了嗎?? 裡面有個Thread sel stage, 也就是說... CORE裡有個HW scheduler來決定現在要執行的thread(or Strand). 再者, OS並非直接run在processor上, 而是中間還多架構一層Hypervisor, 也就是說, 你可以在一顆8-core的processor上跑最多八個OSs !!

那麼...是不是一定要Hypervisor的存在...老師想搞的應該是不用啦.

以下聯結應該可以解答部份老師的問題:
Single Threaded OpenSparc T1 Scheduling
feeding instructions to the Sparc Pipe

先update至此 :)

TITMIS-鈞 提到...

YL:
你提到架構圖為何沒cache/memory。如果是指第二張圖,那是因為我只強調網路資料交換部分的架構示意圖,所以Cores只用一個圓圈圈代表。

yl 提到...

Sparc instruction simulator (SIS)
以下可以試看看
ESA:

ERC32-CCS & SIS download


CASPER -- Chip Multi-Threading (CMT) Architecture Simulator for
Performance, Energy and aRea Analysis (SPARC V9 ISA) (OpenSparc best award)

Legion, the SPARC Simulator

The Sparc-Sulima Complete UltraSPARC SMP Simulator Project

Technical SPARC CPU Resources

alandai 提到...

關於core之間的通訊協定部分
我想參考TCP通訊協定,實做這些部分來達傳輸的可靠性,只是不知道這樣做對傳輸效率會有多大的影響

封包中主要定義"來源位址"、"目標位址"、"封包大小"、"剩餘window大小"、"資料sequence"、"偵錯資訊"及"要傳送的資料"

封包的遺失與重傳
設定一個delay time,當收方在收到封包後,送出ack給送方。
而送方在送出封包後,,開始計時,若在delay time前沒收到ack,就自動重送封包
根據收到ack的時間來動態的調整delay time

window advertisement
收送方兩端都約好一個空間大小作資料暫存,在傳送封包及ack時告知對方次空間的大小,當空間已滿時暫停傳送

3-way handshake
利用synchronization segment來建立連線,finish segment來終止連線

congestion control
送方送出封包收到ack後,即將資料傳輸量加倍,直到傳輸量達到收方的window size的一半為止

TITMIS-鈞 提到...

我覺得實作通信協定部分應該不用太複雜,因為傳輸距離並不是很遠。而且如果再細分出封包,是否會太複雜,而導致影響畢業時程?
如果只加入CRC檢查,有錯重傳,這樣應該比較簡單。除非系統真正運作時,錯誤率太高,再增加通信的查核能力。

SCREAMLab 提到...

請大鈞把我為Multi-8051寫的文件給ㄚ凡參考一下.

實做上你當然須要考慮程式在core上怎麼deploy, 怎麼執行, 怎麼回收.

其次是, Router的設計很重要, 請參考那一份資料.

TITMIS-鈞 提到...

OK. 我會轉寄一份給 Y凡