- 追加された行はこの色です。
- 削除された行はこの色です。
*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
| +- 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