*TESTパッケージ [#n730c9ee] 担当者が Cell C/C++ Langage Extensions と Fixstars とかを調べながら作ったチュートリアルパッケージです。とりあえず、 この関数面白そうだ → 使ってみる → 出来た〜 の流れで公開しますので、なかなか増えないかもしれないです。まぁおまけですから。 **パッケージ構成(2007/12/22現在) [#wc0d2f86] -&ref(test.tar.gz,, テストパッケージ 12/22版); - test +- listdma | +- p_ldma.c | +- s_ldma.c | +- Makefile | +- vectorshift | +- s_vshift.c | +- Makefile | +- reuse +- p_reuse.c +- s_reuse.c +- barrier.c +- barrier.h +- errors.h **使い方 [#nb46dd92] とりあえず、自分の使いたいプログラムのディレクトリで make あとは各プログラムに起動方法かきます。 **説明 [#s1576788] *** listdma [#o286f03a] -PPE-SPE間の転送に使う LIST DMA という機能があります。これを使うと、複数の配列を数本まとめて送れるみたいです。 -C/C++ Langage Extensions 節4.4 です -やっていること ++とりあえず、PPEはa[], b[] に abcdef....z をいれます。13文字ずつわけて ++んで、SPE は a, b のメインメモリのアドレスをもらって、MFC_GETL_CMD をつかって一気に読み込みます ++SPEプリント文でちゃんと受け取れてるか見せてくれます -キーとなるソース for (i = 0; i < 2; i++) { list[i].notify = 0; list[i].reserved = 0; list[i].size = 16; } list[0].eal = mfc_ea2l(args.a); list[1].eal = mfc_ea2l(args.b); spu_mfcdma64(buf, mfc_ea2h(args.a), (unsigned int)&list, sizeof(list), 0, MFC_GETL_CMD); spu_writech(MFC_WrTagMask, 1 << 0); spu_mfcstat(MFC_TAG_UPDATE_ALL); -応用例はこんな感じです→[[FIXSTERS:http://cell.fixstars.com/ps3linux/index.php/DMA%E3%83%AA%E3%82%B9%E3%83%88%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%AE%E3%83%A3%E3%82%B6%E3%83%BC%E3%81%A8%E3%82%B9%E3%82%AD%E3%83%A3%E3%82%BF%E3%83%BC%E3%82%92%E8%A1%8C%E3%81%AA%E3%81%86]] -起動方法 ./p_ldma *** vectorshift [#o286f03a] -SPEで、ヴェクトルを回転させたかった。つまり (0, 1, 2, 3) -> (1, 2, 3, 0) -C/C++ Langage Extensions 節2.10 です -やっていること ++ヴェクトル全体を左に一要素分ローテートしました ++4回繰り返します、最初に戻ります -キーとなるソース va[0] = spu_rlqwbyte(va[0], (int)sizeof(float)); -起動方法 elfspe ./s_vshift *** reuse [#i2d21937] -SPEコンテキストとPthread を再利用するにはどうすればいいかなという試行錯誤 -これを見ると、N体問題の計算部分以外は出来てしまいます。たぶんね。これを骨組みにつくってもいいかもしれない。 -同梱の barrier.c barrier.h errors.h は Dave Butenhof 氏のつくったライブラリです。ライセンスは明記してないけど GPL あたりなので、私用に使うときは気をつけて -すくなくとも、利益の発生するような使い方では使ってほしくないようです。 -やっていること、キーとなるソース えっと、書いてしまうと課題が全部分かってしまうので、各自解析してみてください。 --えっと、書いてしまうと課題が全部分かってしまうので、各自解析してみてください。 -起動方法 ./p_reuse