SPEプログラミングで必要となる3種類のデバッギングについて考察している.詳細はHPをみよう.実行結果は
result=524800
open spe program
Create and Start spe program
0:flag=1
1:flag=1
start:513 end:1024 sum=393472
dma_data.flag=1
dma_data.flag=2
start:1 end:512 sum=131328
dma_data.flag=1
dma_data.flag=2
0:flag=2
1:flag=2
Waiting spe0 program is finish...done
Relese spe0 program
Waiting spe1 program is finish...done
Relese spe1 program
SPE result : 524800 (PPE result : 524800)
lesson11
PPEの処理時間を計測するプログラミング.
使っているPCはP4 3.8GHzをHT動作でVMWare.SPEの処理時間がべらぼうに遅いのは,あくまでエミュレータ環境だから,らしい.result=524800
open spe program
Create and Start spe program
0:flag=1
1:flag=1
start:1 end:512 sum=131328
dma_data.flag=1
dma_data.flag=2
0:flag=2
start:513 end:1024 sum=393472
dma_data.flag=1
dma_data.flag=2
1:flag=2
Waiting spe0 program is finish...done
Relese spe0 program
Waiting spe1 program is finish...done
Relese spe1 program
SPE result : 524800 (PPE result : 524800)
PPE time: 0.014000, SPE time: 5.486000
lesson12
SPE処理時間をSPE上で計測する方法.デフォルトのspe_main.cだと,時間測定に利用する1周期の時間が2GHzの設定になっているので修正する.1周期の値は
で知ることができる.つまり25MHz.よってspe_main.cの65行目[root@(none) ~]# dmesg | grep decrementer
time_init: decrementer frequency = 25.000000 MHz
を/* 処理時間を出力 */
printf("SPE time by SPU Decrementer: %f\n", profile / 2000000000.0f * 1000.0f);
に変更する.実行結果はprintf("SPE time by SPU Decrementer: %f\n", profile / 25000000.0f * 1000.0f);
lesson11よりもSPEの処理時間が早くなったのは,SPE内で時間を測定しているからだろう.result=524800
Open spe program
Create and Start spe program
0:flag=1
1:flag=1
SPE time by SPU Decrementer: 0.001440
start:1 end:512 sum=131328
dma_data.flag=1
dma_data.flag=2
0:flag=2
SPE time by SPU Decrementer: 0.001440
start:513 end:1024 sum=393472
dma_data.flag=1
dma_data.flag=2
1:flag=2
Waiting spe0 program is finish...done
Relese spe0 program
Waiting spe1 program is finish...done
Relese spe1 program
SPE result : 524800 (PPE result : 524800)
PPE time: 0.013000, SPE time: 5.599000
lesson13
最後.lesson12のSPEプログラムをSIMD演算に変更し,パフォーマンスを高める.
結果をlesson12と比べると,5.599/1.601=3.497と約3.5倍高速化できたことがわかる.以上,すべての入門編lessonが無事終了.result=524800
Open spe program
Create and Start spe program
0:flag=1
1:flag=1
SPE time by SPU Decrementer: 0.000400
start:513 end:1024 sum=393472
dma_data.flag=1
dma_data.flag=2
SPE time by SPU Decrementer: 0.000400
start:1 end:512 sum=131328
dma_data.flag=1
dma_data.flag=2
0:flag=2
1:flag=2
Waiting spe0 program is finish...done
Relese spe0 program
Waiting spe1 program is finish...done
Relese spe1 program
SPE result : 524800 (PPE result : 524800)
PPE time: 0.014000, SPE time: 1.601000
簡単な PPE と SPE との同期処理.実行すると
というメッセージが出力される.result=524800
Open spe program
Create and Start spe program
flag=1
flag=2
Waiting spe program is finish...done
Relese spe program
lesson8
SPE プログラムの演算結果を PPE 側へ返す処理を行う.実行結果は
となり,無事成功しているようだ.result=524800
Open spe program
Create and Start spe program
flag=1
flag=2
Waiting spe program is finish...done
Relese spe program
SPE result : 524800 (PPE result : 524800)
lesson9
複数のSPEを起動して並列処理.いよいよおもしろくなってきた.実行すると並列個数分の結果がでてくる.
長ったらしいが,SPEが8個あるので仕方がない.result=524800
Open spe program
Create and Start spe program
0:flag=1
1:flag=1
2:flag=1
3:flag=1
4:flag=1
5:flag=1
6:flag=1
7:flag=1
0:flag=2
1:flag=2
2:flag=2
3:flag=2
4:flag=2
5:flag=2
6:flag=2
7:flag=2
Waiting spe0 program is finish...done
Relese spe0 program
Waiting spe1 program is finish...done
Relese spe1 program
Waiting spe2 program is finish...done
Relese spe2 program
Waiting spe3 program is finish...done
Relese spe3 program
Waiting spe4 program is finish...done
Relese spe4 program
Waiting spe5 program is finish...done
Relese spe5 program
Waiting spe6 program is finish...done
Relese spe6 program
Waiting spe7 program is finish...done
Relese spe7 program
SPE result : 524800 (PPE result : 524800)
のlesson3からlesson6まで実行してみる.http://cell.fixstars.com/pukiwiki/index.php?Cell%A5%D7%A5%ED%A5%B0%A5%E9%A5%DF%A5%F3%A5%B0%A5%C1%A5%E5%A1%BC%A5%C8%A5%EA%A5%A2%A5%EB%C6%FE%CC%E7%CA%D4
lesson3
SPEを利用するプログラム,というかコンパイルするプログラム.実行結果はlesson2と同じ.spe_mainはprintf関数が記述されてないし,そもそもppe_main.cで読み込まれてないので何もしない.
lesson4
PPEからSPEを読み出すプログラム.結果は
という表示が現れる.うまく実行できているようだ.result=524800
Open spe program
Create and Start spe program
Waiting spe program is finish...done
Relese spe program
lesson5
メインメモリから SPE 内のローカルストアへのデータ転送(DMA 転送)についてのプログラム.lesson4と同じ結果が出力される.
lesson6
lesson5の逆でSPE 内の ローカルストアからメインメモリへのデータ転送を行う.実行すると,
というメッセージが出力される.result=524800
Open spe program
flag=1
Create and Start spe program
Waiting spe program is finish...done
Relese spe program
flag=2
SDK2.0に対応させるため,~/cell_program/lesson3/src/ppe/MakefileのIBMBASE, SCEBASE, CCを変更する.$ cd ~/cell_program
$ gtar –xzf lesson3.tar.gz
$ cd lesson3
~/cell_program/lesson3/src/speにもMakefileがあるので,SCEBASE, CC, CCFLAGSを変更する(lesson2のみこのファイルは無い).IBMBASE = /opt/ibm/cell-sdk/prototype/sysroot/usr
SCEBASE = /opt/cell/toolchain-3.3
CC = $(SCEBASE)/bin/ppu-gcc
lesson3ディレクトリにて,make;make installを実行.SCEBASE = /opt/cell/toolchain-3.3
CC = $(SCEBASE)/bin/spu-gcc
CCFLAGS = -O3 –I${SCEBASE}/lib/gcc/spu/4.1.1/include
lesson3/binディレクトリに実行ファイル”ppe_main”と”spe_main”がインストールされる.$ make;make install
CELLシミュレータを立ち上げ,コンソールにて実行ファイルppe_mainを読み込む.
実行パーミッションを与え,実行する.[root@(none)]# callthru source /home/ユーザ名/cell_program/lesson3/bin/ppe_main > ppe_main
[root@(none)]# callthru source /home/ユーザ名/cell_program/lesson3/bin/spe_main > spe_main
以上がコンパイルと実行方法.プログラム内容によって実行結果がコンソールに表示される.[root@(none)]# chmod +x ppe_main spe_main
[root@(none)]# ./ppe_main
lesson2
1~1024までの総和をCELLのPPEを使って求めるプログラム.文法的にはふつうのCプログラム.若干main関数の引数が違うぐらい.実行すると
確かに1~1024の総和が求まった(エクセルとかで確認してみよう).[root@(none)]# ./ppe_main
result=524800
最初のプログラムといえば"Hello World".Fixstarsのサンプルが
に置いてあるので,ページの一番下hello_ppu.tar.gzをダウンロードし,ホームの下に"cell_program"ディレクトリを作ってそこに保存する(以後,サンプルの保存場所はここ).展開してできた"hello_ppu"フォルダに移動し,binディレクトリを作成しておく(こうしないとmake installで実行ファイルがうまくbin/に作成されなかった).http://cell.fixstars.com/pukiwiki/index.php?PPE%C8%C7%20Hello%20World
さて,Fixstarsに掲載されているプログラムはCELLSDK1.1を対象にしているので,Makefileを修正しなくてはならない.src/ppu/Makefileの該当箇所を以下のように編集.$ mkdir bin
そしたらhello_ppu直下でIBMBASE = /opt/ibm/cell-sdk/prototype/sysroot/usr
SCEBASE = /opt/cell/toolchain-3.3
CC = $(SCEBASE)/bin/ppu-gcc
する.特にErrorがでなければOK.bin/に"ppu_main"という実行ファイルが作成される.$ make;make_install
コンパイルした実行ファイルはCellのPPE/SPEを利用することが前提なので,x86のFC5上では実行できない.そこでCELLシミュレータを立ち上げ,CELL環境をエミュレートする.rootじゃないと駄目なので注意.
下図に示すセルシミュレータのGUIが出現する.# cd /opt/ibm/systemsim-cell/run/cell/linux
# ../run_gui

このままでは駄目で,動かすにはGUIの"GO"ボタンを押さなくてはいけない.するとシミュレータ上でFedora Coreが立ち上がり,仮想Cell計算機がエミュレートされる,という寸法(だと思う).無事立ち上がったら上の画面下にある"mysim"コンソールに
が現れる."Press ‘I’"と出てもIキーを押す必要はないので注意.Welcome to Fedora Core
Press ‘I’ to enter interactive startup.
INIT: Entering runlevel: 2
[root@(none) ~]#
ここで補足.ふつうに"GO"を押すと起動にめっちゃ時間がかかるので,その前に"Fast Mode"をクリックしておけば,デバッグなし起動になって速く起動する.
ではGOボタンを押してエミュレータを起動し,先ほどコンパイルしたファイルをエミュレータで実行する.エミュレータとFC5のディレクトリは同期していないので,エミュレータにファイルを読み込まなくてはいけない.CELLコンソールにて,
を実行するとファイルが転送される.後は実行するのみ.ただし,実行パーミッションがないと怒られるので,chmod +xしておくこと.[root(none) ~]# callthru source /home/ユーザ名/cell_program/hello_ppu/bin/ppu_main > ppu_main
無事"Hello World!"が表示された!.[root(none) ~]# chmod +x ./ppu_main
[root(none) ~]# ./ppu_main
Hello World!
ここでもいっちょ補足.Cellシミュレータは実際にプログラムを動作させるとき以外は起動している必要がない.そこで一度立ち上げたら"Stop"ボタンを押して一時停止しておき,元のFedora上でプログラムの作成(編集)を行い,コンパイルし,完成したらエミュレータで読み込みGOボタン押して転送,実行,という流れにすれば良い.一時停止中は負荷がないので,こうするのが基本.
以上が簡単なCELLプログラミング&シミュレータの使い方.一度シミュレータを落とすとcallthruでとってきたファイルは消えてしまうので注意.
最新バージョンは2.1だけど,これはFedora Core 6ベースになっている.PS3はFC5じゃないとうまくいかないようなので,2.0をダウンロードしよう.無料のアカウント登録が必要.以下,インストール方法について.http://www.alphaworks.ibm.com/tech/cellsw?open&S_TACT=105AGX16&S_CMP=DWPA
CellSDK2.0だけでは必要なパッケージが揃っていない.インストール時にダウンロードできるようにはなっているのだが,しょっちゅう接続がとぎれてうまくいかない.よって次のサイト
にすべてのファイルがあるので,ダウンロードして/tmp/cellsdk-2.0/に保存しておこう.こうすればSDKインストール時にこれらのファイルを参照してインストールしてくれる.さらに,tkとfreeglut-develが事前に必要なので,http://www.bsc.es/projects/deepcomputing/linuxoncell/cellsimulator/sdk2.0/
でインストールしておく.# yum install tk
# yum install freeglut-devel
ではダウンロードしたCellSDK20.isoをマウントし,インストール実行する.
ダウンロードファイルが正常だと# mkdir -p /mnt/cellsdk
# mount -t iso9660 -r -o loop ./CellSDK20.iso /mnt/cellsdk
# cd /mnt/cellsdk/software
# ./cellsdk install
と出力される.言われるがままサンプルをビルドする.結構時間がかかる(5分ぐらい?).Cell SDK Install complete.
You can now build the samples by executing ‘./cellsdk build [--gcc| --xlc]”.
以上でインストール作業は終わり.しかし,一部パッケージにバグがあるらしく,以下を実行して解決する.下記のサイト#./cellsdk build
からファイルをすべてダウンロードして,適当な位置(ここでは/root/bugfix)に保存しrootユーザで以下を実行.http://cell.fixstars.com/ps3linux/download/cell-linux-20061208/CELL-Linux-CL_20061208-ADDON/spu/
無事終了したら,ダウンロードしたファイルはいらないので削除.マウントしたISOイメージを解放し,ファイルは削除しよう.# rpm -ivh --force --nodeps --noscripts --ignorearch --root /opt/ibm/cell-sdk/prototype/sysroot /root/bugfix/*.ppc.rpm
# rpm -ivh --force --nodeps --noscripts --ignorearch --root /opt/ibm/cell-sdk/prototype/sysroot /root/bugfix/*.ppc64.rpm
# umount /mnt/cellsdk
まずは
からVMWare ServerのLinux版(VMware-server-1.0.2-39867.tar)をダウンロードする.登録すればフリー.展開すると,vmware-server-distrib\lib\isoimagesにlinux.isoファイルがある.これをfc5.vmdkを置いているフォルダにコピーしておく.コピーしたら展開したフォルダはいらないので削除してもOK.linux.isoをマウントするようにfc5.vmxを書き換える.http://www.vmware.com/ja/download/server/
fc5.vmxをダブルクリックして起動する.fc5にログインすると,デスクトップにCDイメージがあり,マウントされてるのがわかる.ide1:0.fileName = "linux.iso"

さて,このlinux.isoの中にVMWare Toolsインストールパッケージがあるのだが,その前にFC5へkernel-develパッケージをインストールしなくてはならない.suにて
を実行しよう.そしたら/root直下でも良いので以下を実行.# yum install kernel-devel
インストールが始まる.すべてデフォルトでOKと思われるので,リターンを押していけば問題ないはず.ただ,途中でShared Foldersの設定でエラーがでたどうのこうのと言われるが,特に関係ないので無視してエンター.最後まで進んでいくと,# cd /root
# cp /media/VMware Tools/VMwareTools-1.0.2-39867.tar.gz .
# gtar –xzf VMwareTools-1.0.2-39867.tar.gz
# cd vmware-tools-distrib
# ./vmware-install.pl

の画面が現れる.お好きな画面サイズを選びましょう.無事終了すると,

の画面になるので,再起動.起動後,画面サイズの拡大とマウスの自由移動が可能になる.
これでlinux.isoをマウントしておく必要はないので,いったんFC5をシャットダウンし,fc5.vmxのlinux.isoに関する記述を削除し,代わりに
のように変更しておこう.ide1:0.fileName = "auto detect"
ide1:0.deviceType = "cdrom-raw"












