PS3 で Xubuntu 9.10

Index > 趣味 > Computer > Xubuntu on PS3

はじめに

PS3 に Xubuntu 9.10 をインストールして,Cell のプログラミングを試そうとしている記録です.

OpenCL

IBM が公開している Cell 用の OpenCL SDK をかなり強引な方法を使いました がインストールしました.サンプルプログラムは全てコンパイル&実行できて いるので,インストールには一応成功しているようです.

OpenCL_Guide.pdf に指定されているあらかじめ必 要とされるパッケージは,cell-sdk というパッケー ジでまとめてインストール可能でした.他に numactl もインストールします.また,OpenCL の SDK は rpm パッケージで公開されているので,alien もインストールしておきました.

opencl-01.1.tar.gzに含まれる rpm パッケージは, alien で deb パッケージに変換したものをインス トールしました.

xlc.opencl.01.1.linux.ppc.isoに含まれる rpm パッ ケージは alien では変換できないと言う情報が Web 上に出ていたので,xlc_install を強引に書 き換えて rpm コマンドで直接インストールしまし た.その際,依存関係のチェックルーチンを常に成功させ,またrpm--force-debian --nodeps --ignorearch オプションを書き加えました.

サンプルプログラムの julia を実行する時に,libstdc++.so.6の 64bit 版を要求されましたので,イン ストールしました.また,spu を使用するために /etc/fstabnone /spu spufs gid=spu 0 0 を追加しました.

SPU を使った場合の julia の実行結果は次のようになりました.

$./julia_ocl -a -b 
Device: "ACCELERATOR CellBE processor" 
Loading program binary 'julia_kernel_ACCELERATOR_CellBE_processor_lwgsize1'....
50 Frames took 2.090000 seconds. Rate = 6.271388 Mpixels/sec

Matrix Multiplication on Cell

KHRONOS の Tutorials and Sample Code でも紹介されている GPGPU Programming (OpenCL) のページの Matrix Multiplication を PS3 上の OpenCL で動 かしてみるついでに,色々試してみました.

Matrix Multiplication 2 で紹介されているソースコードはほとんどそのまま PS3 上で動作しましたが,速度はかなり遅かったです.PPE 上で実行させた計 算との比較は次のような結果になりました.コードは main.ckenel1.cl の通りです."clock.h", "clock.c" は OpenCL のサンプルから取って来てます.また,エラーチェック をほとんど行っていないので,その点はあらかじめ注意してください.

kernel took 104.449997 seconds
cpu took 149.699997 seconds
acceleration ratio 1.433222
different result 0/1048576

SPU(SPE) は SIMD 演算の機能を持っているので,kernel のコード中で明示的 にベクトル型(float4)を使用して計算の高速化を図ってみましたが,使い方が 悪いのか結果はかえって遅くなりました.コードは kenel1s.cl です.

kernel took 105.029999 seconds
cpu took 149.800003 seconds
acceleration ratio 1.426259
different result 0/1048576

高速化が行われている Matrix Multiplication 3 の kernel のコードがコン パイルできなかったので,同じロジックながら task parallel のモデルに作 り変えました.コードは main2.ckenel2.cl の通りです. BLOCK_SIZE を 16, 32, 64, 128 と変えて実行しました が,64 が最速で 128 はメモリー不足でした.local メモリーの確保は host 側からも行えるし,そうするとバイナリの使いまわしも容易になるんですが, 実行速度が落ちました.

BLOCK_SIZE is 16 -- Matrix size is 1024x1024
kernel took 0.850000 seconds
cpu took 148.399994 seconds
acceleration ratio 174.588226
different result 0/1048576

BLOCK_SIZE is 32 -- Matrix size is 1024x1024
kernel took 0.540000 seconds
cpu took 148.820007 seconds
acceleration ratio 275.592590
different result 0/1048576

BLOCK_SIZE is 64 -- Matrix size is 1024x1024
kernel took 0.420000 seconds
cpu took 148.029999 seconds
acceleration ratio 352.452393
different result 0/1048576

BLOCK_SIZE is 128 -- Matrix size is 1024x1024
Aborted

ソースコードから毎回コンパイルさせるとかなり遅く感じますが,あらかじめ コンパイル済みの kernelをロードさせて実行させると快適に計算が進みます. 余録として何故か kernel の実行時間も短くなる傾向が見られます.検算は 外してます.

time ./main2
BLOCK_SIZE is 64 -- Matrix size is 1024x1024
kernel took 0.360000 seconds

real    0m1.030s
user    0m0.613s
sys     0m0.163s

このバージョンは十分高速 (350 倍以上)なので,SIMD 化は試してませんが, 先の例からするとコンパイラが最適化する際に SIMD を活用しているような感 じもするので,自前で変に意識しない方が良いかもしれません.