アーカイブ

‘Cell’ カテゴリーのアーカイブ

薄型PS3が出るぞ! だがしかしっ!

2009 年 8 月 19 日 tgbt コメントはありません

[http://oneclip.jp/NtyZJL/http://japanese.engadget.com/2009/08/18/ps3-2-9980/:title=]

ちょっと前からあちこちで話題になってはいたけど,どうやら公式に発表されたらしい.薄い!比較表は本家engadgetがわかりやすい.

[http://oneclip.jp/OELwq0/http://www.engadget.com/2009/08/18/ps3-slim-sized-up-smaller-deeper-no-linux-or-ps2-compatibilit/:title=]

……あ……れ……PS2互換はともかく,Linux互換が削れてるぞ……?

待て待て,Linuxを入れればCellがいじれる,ってのはPS3の購入動機の一つとして市民権を得ているモノだと勝手に思っていたんだが,そんなことは無かったかチクショウ.

安価に手に入る,気軽に使えるってのは重要なはずなんだけどなあ?

薄型PS3が出たら(弄る時間があるかどうかはともかくとして)Cellを弄って遊ぶために私物として一台購入しようと思っていた私が涙目です.ファッキン.

カテゴリー: *nix・サーバ関連, Cell, ゲーム タグ:

CellChallenge予選終了

2009 年 2 月 27 日 tgbt コメントはありません

もう少し時間があるけど,やめた.

昨夜,狙ったかのように講座のPS3Linuxが不調に.SPEが応答しない.

仕方がないので主催者側で用意しているCellマシンを利用したが,混雑していて自由にプログラムを実行できない.ところがCell上でのプログラム実行時間はばらつきがそれなりにあるので,繰り返し実行しないと最適化の優位性が確認できない.

というわけで,アンローリングとか細かい最適化をいろいろやってみたかったけど,成果がよくわからない環境状況(?)なので諦めた.

まぁ正しく動くものは出したつもりなので,決勝に残れたらもう少しやるか.

昨夜DMAダブルバッファリングにはまりまくったんだけど,原因は自分で作成した関数の引数順序を勘違いしていたのが原因だった.ばーかばーか.まぁ正しく動いても全然速くなってないんだけどね! orz

カテゴリー: Cell タグ:

CellChallenge提出日

2009 年 2 月 27 日 tgbt コメントはありません

17時だったかな.

26日の夜に研究室のPS3がいかれたのはお約束。

とりあえずSIMD化はした.PS3上で倍くらいの性能になった.

あとはDMAダブルバッファリングでもやってみようと思って,調整しやすいように静的スケジューリングを作成した.でも肝心のDMAが,非同期にした時点でアウト.どの処理が正しくない結果を出しちゃうのかはわかるのに,どうして正しい結果が得られないのかがわからないという素晴らしい状態.もうどうにでもなあーれっ.

とある配列のDMA転送を同期か非同期か変更すると駄目になるんだけど,非同期化させる方法が間違ってるんだろうなぁ.問題が起きる場所がピンポイント過ぎて意味がわからない.

とりあえず提出状態にはしたので,あと朝起きたら夕方までループアンローリングを行う仕事でもします.

予選をまともに通過したらDMAダブルバッファリングに再挑戦するかもね.

カテゴリー: Cell タグ:

ほぼ初めてみたいなSIMD(ry 2

2009 年 2 月 10 日 tgbt コメントはありません

ほぼ初めてみたいなSIMDプログラミング,略してはじしむ?

とりあえずCellのSPE向けにSIMDってみた.

サンプルとしてメディアンフィルタ……みたいなものを意識して,ある点の周囲の点の座標を合算するものを作ってみた.

まずはCで書いた元プログラム.

C:
  1. </p>
  2. <p>  for(m=0; m<LOOP; m++){</p>
  3. <p>    margin = m*128*128;</p>
  4. <p>    for(i=1; i<128-1; i++){</p>
  5. <p>      for(k=1; k<128-1; k++){</p>
  6. <p>        data2[margin + i*128+k] =</p>
  7. <p>          (data1[margin + (i-1)*128+(k-1)]</p>
  8. <p>           + data1[margin + (i-1)*128+(k+1)]</p>
  9. <p>           + data1[margin + (i+1)*128+(k-1)]</p>
  10. <p>           + data1[margin + (i+1)*128+(k+1)]);</p>
  11. <p>      }</p>
  12. <p>    }</p>
  13. <p>  }</p>
  14. <p>

マージンが取ってあるのは,繰り返し計算して実行時間を引き延ばすため.めんどいから端点の処理はしない.ただ足しているだけなのは処理を最低限にしないと正しく実行できているかのチェックがツライため.チキンコード.

ちなみにデータ型はunsigned int.

続いてSPE向けのコード.

C:
  1. </p>
  2. <p>    for(i=1; i<128-1; i++){</p>
  3. <p>      for(k=1; k<128-1; k++){</p>
  4. <p>        outdata[i*128+k] =</p>
  5. <p>          (</p>
  6. <p>           indata[(i-1)*128+(k-1)] +</p>
  7. <p>           indata[(i-1)*128+(k+1)] +</p>
  8. <p>           indata[(i+1)*128+(k-1)] +</p>
  9. <p>           indata[(i+1)*128+(k+1)]</p>
  10. <p>           );</p>
  11. <p>      }</p>
  12. <p>    }</p>
  13. <p>

データを128*128ごとにDMAってるのでこんなんになる.

続いてSIMD化コード.

C:
  1. </p>
  2. <p>    for(i=1; i<128-1; i++){</p>
  3. <p>      int x, y;</p>
  4. <p>      vector unsigned int *v[6];</p>
  5. <p>      vector unsigned int *t;</p>
  6. <p>      vector unsigned int w[6];</p>
  7. <p>      vector unsigned char s0 = (vector unsigned char){</p>
  8. <p>        0x0c, 0x0d, 0x0e, 0x0f,</p>
  9. <p>        0x10, 0x11, 0x12, 0x13,</p>
  10. <p>        0x14, 0x15, 0x16, 0x17,</p>
  11. <p>        0x18, 0x19, 0x1a, 0x1b</p>
  12. <p>      };</p>
  13. <p>      vector unsigned char s1 = (vector unsigned char){</p>
  14. <p>        0x04, 0x05, 0x06, 0x07,</p>
  15. <p>        0x08, 0x09, 0x0a, 0x0b,</p>
  16. <p>        0x0c, 0x0d, 0x0e, 0x0f,</p>
  17. <p>        0x10, 0x11, 0x12, 0x13</p>
  18. <p>      };</p>
  19. <p>      for(x=2; x<30; x++){</p>
  20. <p>        v[0] = (vector unsigned int *)&indata[(i-1)*128+(x-1)*4];</p>
  21. <p>        v[1] = (vector unsigned int *)&indata[(i-1)*128+()*4];</p>
  22. <p>        v[2] = (vector unsigned int *)&indata[(i-1)*128+(x+1)*4];</p>
  23. <p>        v[3] = (vector unsigned int *)&indata[(i+1)*128+(x-1)*4];</p>
  24. <p>        v[4] = (vector unsigned int *)&indata[(i+1)*128+()*4];</p>
  25. <p>        v[5] = (vector unsigned int *)&indata[(i+1)*128+(x+1)*4];</p>
  26. <p>        t = (vector unsigned int *)&outdata[i*128+x*4];</p>
  27.  
  28. <p>        w[0] = spu_shuffle(*v[0], *v[1], s0);</p>
  29. <p>        w[1] = spu_shuffle(*v[1], *v[2], s1);</p>
  30. <p>        w[2] = spu_shuffle(*v[3], *v[4], s0);</p>
  31. <p>        w[3] = spu_shuffle(*v[4], *v[5], s1);</p>
  32. <p>        w[4] = spu_add(w[0], w[1]);</p>
  33. <p>        w[5] = spu_add(w[2], w[3]);</p>
  34. <p>        *t = spu_add(w[4], w[5]);</p>
  35. <p>      }</p>
  36. <p>      for(k=1; k<8; k++){</p>
  37. <p>        outdata[i*128+k] =</p>
  38. <p>          (</p>
  39. <p>           indata[(i-1)*128+(k-1)] +</p>
  40. <p>           indata[(i-1)*128+(k+1)] +</p>
  41. <p>           indata[(i+1)*128+(k-1)] +</p>
  42. <p>           indata[(i+1)*128+(k+1)]</p>
  43. <p>           );</p>
  44. <p>      }</p>
  45. <p>      for(k=120; k<128-1; k++){</p>
  46. <p>        outdata[i*128+k] =</p>
  47. <p>          (</p>
  48. <p>           indata[(i-1)*128+(k-1)] +</p>
  49. <p>           indata[(i-1)*128+(k+1)] +</p>
  50. <p>           indata[(i+1)*128+(k-1)] +</p>
  51. <p>           indata[(i+1)*128+(k+1)]</p>
  52. <p>           );</p>
  53. <p>      }</p>
  54.  
  55. <p>    }</p>
  56. <p>

やりやすいところだけSIMD化した.kループの真ん中あたりだけ.もっとはじっこまで行ける気がするのはとりあえず置いておく.

計算対象の配列のアドレスをvector型のポインタで参照しておいて,vector型で計算すると,計算対象にちゃんと反映されるよ!みたいな感じなのかね.まぁポインタだから当然だけど.なんとなくわかった気がする.

C:
  1. </p>
  2. <p>        正:t = (vector unsigned int *)&outdata[i*128+x*4];</p>
  3. <p>        誤:t = (vector unsigned int *)outdata[i*128+x*4];</p>
  4. <p>

みたいなミスを繰り返しまくったんだけど,vector型へのキャストが強力すぎるのかなんなのか,コンパイラが何も言わないのでしばらく頭を抱えた.これはツライ.

で,とりあえずSPE1つで実行時間を測定してみたんだけど……5回繰り返した最短時間を見ると

  • SIMD化する前: 13.36145091 sec
  • SIMD化した後: 11.95487118 sec

……うーむ,まぁ速くはなったっぽい?

というか,実行時間が結構ばらつきます.実行環境はPS3なんだけど,ハードウェアの特性かな?最長時間を見ると

  • SIMD化する前: 16.74284220 sec
  • SIMD化した後: 15.84491611 sec

……最短との差は3割.まぁそんなものかしら?

SIMDの効果ってこんなものかなあと疑問を持ったので同じものをSSEあたりでやってみようと思ったけど,何を参考にどうくめばいいのかわからず.1時間以上webを漁ったけどよくわからない.また明日以降に試す.

というか,おとなしくPPE向けのSIMD化でもやろう,うん.

カテゴリー: Cell, プログラミング一般 タグ:
-->