Goal:
提供使用者在異質多核心平台上撰寫平行程式的API,以cell為例,在cell上撰寫程式是相對困難的 (MPMD Model) ,因此,實作MPI Standard以減低撰寫的困難度及移植程式的困難度
實作細節:
1. MPI initialization
mpirun -n <N> a.out
此處N表示SPE個數 (i.e worker個數),PPU擔任上層分配工作者,並未參與計算,原因是盡量讓PPU處於free 的狀態以免造成效能瓶頸。
2. Point-to-point communication
假設N為SPE個數,在PPU local端保留了N塊buffer (mpirun process allocate),也就是說,buffer Pi 就是讓SPEi 收送資料的buffer,
而sender&receiver溝通所需的資訊則由SPE local store的meta-data queue (circular queue)維護,因此,共有N*(N-1)個queue
queue Qij 表示SPEi 送資料到SPEj 並且此queue存放在receiver端,因此,每個SPE維護N-1個queue
queue內每個entry存放:
- 1.the location of the message within Pi
- 2.the message tag
- 3.the data type message
- 4.message size
- 5.communicator identifier
- 6.flag
flag 狀態:
- 1. valid --> 表示接收端欲從傳送端接收的資料仍未收到,因此接收端必須前往Pi拿取資料
- 2. invalid --> 表示傳送端可以將資料寫入buffer
[1] Sender protocol :
- 1. 尋找buffer Pi 之free block
- 2. 將資料copy into Pi (paper內提到因為buffer放在main memory,因此,資料由DMA複製到local store 在由DMA複製到buffer內,p.4 第二段)
- 3. 傳送端將Qij的此entry設定為valid並且在Qij內找尋下一個flag標示著invalid的request
[2] Receiver protocol :
- 1. 找尋Qij內標示著valid的request
- 2. 比對tag及communicator並且將資料從buffer複製到application area
- 3. 將entry flag設定為invalid
[3] Lock-free data structure
看無
[4] Communication modes
傳輸模式分成兩種:(1) buffered-mode, (2) synchronous-mode,小資料傳輸適用於buffered-mode,而大資料則適用synchronous-mode,paper內當傳輸資料大小超過2KB則切換到synchronous-mode
心得:
- (1) 前述提到傳送端將資料複製到buffer做了兩次DMA,感覺有點多餘,不知是否能透過memcpy實現
- (2) 文內未實作non-block protocol(放在future work)及collective operation (由send-recv 兜出來)
- (3) 目前msg在PAC Duo上的作法與此處還滿類似的,希望接下來看synchronous-mode能吸收比較特別的作法
留言列表