2009年2月13日 星期五

2009/2 Training course: Cell Programming

這幾天有學弟問我的問題,我稍做整理
1.
問:假如 SPU3 要用mfc_put 把資料丟給SPU4,
我再SPU3裡面這樣寫,
mfc_put(&myps , XXX , sizeof(my_class) , TAG , 0,0);
XXX要放SPU4的 (local store位址) + (變數位址)
我知道local store的位址從problem state可以得到
可是我再SPU3裡面要怎麼抓到SPU4的變數位址呢?
答: 對,這是一個問題,所以你必須在SPU4的code加入"告訴SPU3 它該放在我的Local Store的哪一個address"意思就是你應該在SPU4的Local Store開一個一模一樣的變數,然後用mailbox或signal告訴SPU3這個變數的addr, 叫SPU3將資料傳到這個addr

2.
問:while(spe_out_mbox_status(spe_id[0])==0);
這段code的意思是說SPU0如果他的outbound傳輸是傳給SPU0的話,
就會一直被這個while 迴圈block住嗎?
答:其實是可以直接使用spe_out_mbox_read(),但是有時會出錯,為什麼呢?因為ppe去讀spe的outbound-mailbox是"non-blocking"。所以有可能spe根本還沒把資料寫到out-bound mailbox,但是你卻跑去讀了,所以會得到錯的值。為了預防這樣的錯誤發生,所以我們要去看out-bound mailbox的status,當status的值不是0的時候,代表有資料進來了。而因為你去讀status也是non-blocking,所以要用while loop一直去偵測,直到它不為零。

3.
問:Fenced and Barrier Command
Fenced command: mfc_putfBarrier command: mfc_putb
在每一個SPE當中,會有一個DMA queue,所有要做DMA的command,都會進到這個Queue當中等待執行。但是先送進去DMA不一定會先執行。如果資料送出的先後順序對我們來說是有意義的,但我們又不想要每送一筆就blocking的在等待,所以我們就必須以fenced和barrier command來幫忙將想要資料送出。
於是我們將想要依序的資料用相同的標籤(TAG)標記,然後使用barrier/fencedcommand 將資料送出。
barrier:跟我同樣TAG的DMA指令,比我早進來DMA Queue的指令先做完,才會輪到我做。fenced:跟我同樣TAG的DMA指令,比我早進來DMA Queue的指令先做完,比我後進來指令也可能會先執行,之後再輪到fenced指令去做。

沒有留言: