/* * $Id: README,v 1.5 2008/10/20 10:02:01 gongo Exp $ */ - 概要 int の配列を送り、タスク(Twice) で、配列の要素を2倍にして送り返します。 PPE->SPE の DMA 転送は main.cc の twice_init に 書いてるのでわかってもらえるかなと信じて、タスク側で そのデータの受け取り方を説明する。 ------------------------------------- PPE から送られてきたデータの受け取り ------------------------------------- void *get_input(void *p, int index) を使う。 p には rbuf が入ります。今のところ確定なのでわざわざ書かせる必要も無いか。。。 index は、create task 時に add_inData したと思うけど、その順番になります。 add_inData(data1, size1); add_inData(data2, size2); の順番で記述した場合、 data1 = get_input(rbuf, 0); data2 = get_input(rbuf, 0); で取れます。 ------------------------------------- PPE へデータを送る ------------------------------------- void *get_output(void *p, int index) を使う。 p は wbuf, index は input と同じ感じでいいです。 get_output で受け取った領域でデータを書けば、 このタスクが終了した後に、add_outData で指定したアドレスに書き込まれます。 - 実行方法 ./twice [-cpu spe_num] [-length data_length] -cpu 使用する SPU の数 // 今回はあまり意味の無いオプションです。 // 巨大な配列の場合、複数に振り分けてそれぞれで 2 倍させるっていう // 処理を入れれば意味のあるものになります。誰か(ry -length 配列の要素の数 - 実行例 % ./twice before --- 0 1 2 3 4 5 6 7 8 9 10 11 after --- 0 2 4 6 8 10 12 14 16 18 20 22 % ./twice -length 20 before --- 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 after --- 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 % ./twice -length 15 before --- 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 zsh: bus error ./twice -length 15 上の場合、PS3上(SPE使った場合)では bus error が出ます。 この理由は length にあって、送るデータのバイト数が 4バイト(int) x 15 = 60 バイト だからです。 PPE <-> SPE での DMA 転送のサイズは 1,2,4,8バイト, もしくは 16バイト倍数と決まっています。 このサイズに誤りがある場合、上のように bus error が出ます。 この辺の詳しい仕様は、 Game_project/ps3/docs にある PDF や Fixstars のサイト http://cell.fixstars.com/ps3linux/index.php/3.3 DMA転送によるデータの受け渡し とか見ればわかると思います