« 2008年6月 | トップページ | 2008年12月 »

2008年11月の記事

Cell Open CV

OpenCV on the Cellのインストールに関する質問をいただいたため、ちょっと試してみました。けっこうおもしろいです。

OpenCVとはインテルが開発・公開している画像処理のライブラリで、Linuxの他Windowsでも動作します。今回始めて知りましたが、画像の回転、エッジ検出などの処理を行う汎用ライブラリです。ドキュメントはここです。

OpenCV on the Cellは、オリジナルのOpenCVをCellに最適化したもので、SPEに処理を分散・並列処理することが可能となっています。

インストール

FixStarsさんのOpenCV on the Cellに従ってインストールします。

Sourcforge project pageから、以下のrpmをダウンロードします。

  • opencv-cell-1.0.0-2.ppc.rpm
  • opencv-cell-devel-1.0.0-2.ppc.rpm
  • cvcell-0.1.0-2.ppc.rpm
  • cvcell-demo-0.1.0-2.ppc.rpm

# rpm -ivh <rpmファイル名>でインストールすると、以下のディレクトリにファイルが展開されます。
 /opt/cvcell/bin -- コンパイルされたサンプルプログラム
 /usr/share/opencv-cell -- サンプルソースなど

.bash_profileを編集して、以下の環境変数を追加します。
 CVCELL_SPENUM=6
 LD_LIBRARY_PATH=/opt/cvcell/lib:$LD_LIBRARY_PATH
 export CVCELL_SPENUM
 export LD_LIBRARY_PATH


デモプログラムの実行

/opt/cvcell/binにある顔認識プログラムを動かしてみます。
 $ ./facedetect.exe --cascade=haarcascade_frontalface_alt.xml lena.jpg
以下の結果が表示されれば成功です。

Screenshotresult_3

--cascade=haarcascade_frontalface_alt.xmlは、正面顔を学習させた識別器の指定です。haarcascade_xxのファイルは、/opt/cvcell/binもしくは /usr/share/opencv-cell/haarcascadesにインストールされます。

OpenCVを使用したプログラムの概要は、このWeb記事が参考になりました。


サンプルプログラムのコンパイル

/usr/share/opencv-cell/samples/cにある、facedetect.cをコンパイルしてみました。おそらく、デモプルグラムとして使用したfacedetect.exeのソースだと思います。そのままコンパイルすることもできるのですが、ヘッダファイルのインクルードでエラーが出るため、ソースを若干変更しました。修正版のソースはここです

コンパイルはSDK 3.1で行いました。標準のppu-gcc 4.1.1を使用した場合、リンク時にエラーが出てしまったため、プロトタイプとして配布されているppu-gcc 4.3を追加インストールして以下のようにコンパイル・リンクしました。

$ ppu-gcc43 -O3 -Wall -c -m32 -mabi=altivec -maltivec -o facedetect.o facedetect.c
$ ppu-gcc43 -m32 -o facedetect  facedetect.o -lcv -lcxcore -lhighgui -lcvaux

修正版のソースでは、デフォルトでcascadeファイルとして/usr/share/opencv-cell/haarcascades/haarcascade_frontalface_alt.xmlを指定するようにしてあります。そのため、以下のように画像ファイルを指定することで顔認識ができます。
 $ facedetect <image file>

PC LinuxにもOpenCVをインストールし、同一ソースをコンパイルして顔認識の速度を比較してみました。画像データーは、OpenCVに添付のlena.jpgです。結果は以下の通りです:

  • PS3 : 100.058ms
  • PC(C2Q 9450)  : 233.94ms

PCはCore2 Quad (3GHz)ですが、OpenCVがマルチスレッドに非対応のため、1コアしか動作しません。一方Cell版OpenCVは自動的に6 SPEに処理分散するため、PCの半分以下で処理ができました。

顔認識の処理では、OpenCVのAPIである"cvHaarDetectObjects"関数をPPE側で呼び出してオブジェクト検出を起動していますが、自動的にSPEを起動してくれるためSPE毎のデーター分割を考える必要がなく、プログラム的には非常に楽ちんです。

プログラムの実行中に/spuを見ると、以下のように複数SPEが動作していることが分かります。

# ls /spu
spethread-4184-268519504  spethread-4184-268521104  spethread-4184-268522704
spethread-4184-268520304  spethread-4184-268521904  spethread-4184-268523504

オブジェクト検出処理を行う以下のコードのパラメーターをいじると認識率が変化します。
CvSeq* faces = cvHaarDetectObjects( small_img, cascade, storage,
        1.1, 2, 0/*CV_HAAR_DO_CANNY_PRUNING*/,
         cvSize(30, 30) );


2008/11/24追記

PC LinuxでのOpenCVの並列化ですが、ひょっとしてOpenMPと組み合わせることでできないかと考え、試したのですが処理性能に変化はありませんでした。

Webで検索すると、OpenCVのビルドオプションに"--with-openmp"があるようですが、私はrpmパッケージでインストールしているため、ソースからのコンパイルまでは試していません。

2008/11/29追記

Webカメラ(Logicool Qcam S 7500)を接続したところ、無事カメラを認識してくれfacedetect.cのサンプルコードでカメラ画像の連続顔認識も動作しました。Fedora 9のカーネル2.6.27は再コンパイルなしでWebカメラを認識できましたが、カメラを使うアプリケーション(facedetect)はrootでないとキャプチャーデバイスをオープンできませんでした。この点は謎です。

処理性能に関しては、PS3では120〜122ms程度で1フレームを処理できます。PC(C2Q 9450)では250ms程度の処理時間がかかるため、PS3の方が高速に処理できていることが分かります。

Cell SDK 3.1のインストール

久しぶりの更新になります。

Cell SDK 3.1が公開されましたので、PS3とPC(クロス開発環境)にインストールを行いました。SDK 3.1はFedora 9が動作条件のため、Linux環境もFedora 9に更新しました。インストールの手順と気がついた点を記載します。

PS3へのSDK 3.1インストール

□1. ファイルのダウンロード

IBM Cell Broadband Engine resource centerからインストールに必要なファイルをダウンロードします。上記のページから、「Download SDK 3.1 for Fedora 9 from developerWorks」のリンクに進み以下のファイルをダウンロードします。(ダウンロードにはUser ID登録が必要です)。

  • CellSDK-Devel-Fedora_3.1.0.0.0.iso
  • CellSDK-Extras-Fedora_3.1.0.0.0.iso
  • cell-install-3.1.0-0.0.noarch.rpm

ダウンロードしたファイルを適当なディレクトリに保存します。例えば;
   /tmp/cellsdk31

□2. インストール手順

1)yum update daemonが動いている場合事前に停止

デフォルトではインストールされないと思います。以下のコマンドを実行して、エラーになったらそのまま次に進みます。
# /etc/init.d/yum-updatesd stop
bash: /etc/init.d/yum-updatesd: そのようなファイルやディレクトリはありません
 →エラーの例

2)インストールに必要なパッケージを追加

# yum install glibc-devel.ppc64 numactl numactl-devel rsync sed tcl wget
glibc-devel.ppc64/numactlはサンプルソースのコンパイル時に必要となります。

3)インストールスクリプトの実行

ダウンロードファイルを保存したディレクトリ移動して以下のファイルを展開
# rpm -ivh cell-install-3.1.0-0.0.noarch.rpm

/opt/cellに移動して、インストールスクリプトを実行
# ./cellsdk --iso </tmp/cellsdk31> install
< >内は、ダウンロードファイルを保存したディレクトリ名を指定

インストーラーの指示(ライセンス条件に同意など)に従えば作業完了です。

4)後処理

libspe2などがyumで更新されないように、/etc/yum.confに以下の定義を追加
exclude=blas blas-devel elfspe2 kernel lapack lapack-devel libspe2 libspe2-debuginfo libspe2-devel oprofile oprofile-devel

#./cellsdk verifyにてインストール内容を確認。

追加インストールしたいパッケージがあれば、以下の手順で追加が可能。
#opt/cell/cellsdk --iso /tmp/cellsdk31 mount
#yum install <追加したいパッケージ名>

パッケージの概要はマニュアルを参照。


PCへのSDK 3.1のインストール

基本的には、PS3へのインストールと同様です。

1)事前作業

# yum install rsync sed tcl wget
PCによるクロス開発環境の場合、yum-updateの影響はないため、yum updateの停止やexcludeの設定は不要だと思います。

2)インストールスクリプトの実行

PS3版と同様です。

3)後処理

#./cellsdk verifyにてインストール内容を確認。


Cell IDEのインストール

Eclipse IDE用に、Cellプログラム開発用プラグインが提供されています。導入手順は以下の通りです。

1)Eclipse IDEのインストール

EclipseはFedora 9のディストリビューションに入っている3.3を使用します。Eclipseはデフォルトではインストールされないため追加が必要ですが、Fedora 9のパッケージ管理(gpk-application)はグループ単位の指定ができず、Eclipseのパッケージが列挙されてしまうため、最低限何をインストールすればよいのかが分かりません。以前のPuirtの方がよっぽど使いやすかったのですが、、、 YumExをインストールして、Fedora Eclipseグループを指定すればOKです。

2) IBM Java環境の導入

Fedora 9のデフォルトでは、以下の通り、Open JDKがインストールされます。

$ java -version
java version "1.6.0"
OpenJDK  Runtime Environment (build 1.6.0-b09)
OpenJDK Server VM (build 1.6.0-b09, mixed mode)

IDEのインストールマニュアルによると、IDEにはIBMのJREが必要となるため、以下の手順でインストールします。

# /opt/cell/cellsdk --iso /tmp/cellsdk31 mount  → ダウンロードしたisoイメージをマウント
# yum install ibm-java2-i386-jre

パスを以下のように編集
JAVA_HOME=/opt/ibm/java2-i386-50/jre
SYSTEMSIM_TOP=/opt/ibm/systemsim-cell
PATH=$JAVA_HOME/bin:$SYSTEMSIM_TOP/bin:$HOME/bin:$PATH

export SYSTEMSIM_TOP
export JAVA_HOME
export PATH

$  java -version
java version "1.5.0"
Java(TM) 2 Runtime Environment, Standard Edition (build pxi32dev-20080710 (SR8))
IBM J9 VM (build 2.3, J2RE 1.5.0 IBM J9 2.3 Linux x86-32 j9vmxi3223-20080710 (JIT enabled)

3)シミュレーターのインストール

SDKのisoイメージには入っていないため、「IBM Full-System Simulator」サイトから追加ダウンロードが必要です。ダウンロードしたrpmファイルをインストールします。
# yum install sysroot_image-3.1-1.noarch
# yum install libBLT24.so
# rpm -ivh systemsim-cell-3.1-8.f9.i386.rpm

ただし、シミュレーターの起動スクリプトに問題があるようで、IDEのデバックモードでシミュレーターを使うことはできませんでした。以前投稿した方法で、PS3実機をリモートマシンとしてPCのIDEからデバッグが可能です。

4)IDEプラグインのインストール

# yum install cellide
/opt/cell/ide/eclipseにプラグインのファイルが展開されます。

Eclipseを起動して、以下のメニューをたどり、プラグインをインストールします。
Help→ Software Update→ Find and Install→ Select new features to install →
next→ New local site→ /opt/cell/ide/eclipseを指定


使ってみて

IDEはCDT 4.0ベースとなったため、コード補完機能が賢くなり以前より使い勝手が向上しました。SDK 3.0 (CDT 3.1)で作成したプロジェクトは概ね自動変換ができました。(ただし、一部変換がエラーになり、プロジェクトを再作成したケースがありました)。

IDEからのデバックですが、SDK 3.0では、speプログラム内に設定したブレークポイントでうまく停止しない問題によく遭遇しましたが、今のところspeプログラム内のブレークも問題なく動いており、SDK 3.0のデバック環境より安定していると感じています。

以前このブログで投稿した、行列積の計算プログラムが今回も添付されていますが、speプログラムがフルアセンブラ化され、より最適化が進んでいます。gccでコンパイルして3072 x 3072の行列積計算を実行してみると、何と152.24 GFlopsとなりました;

# ./matrix_mul -i 5 -m 3072 -p -H -s 6 -o 4
Initializing Arrays ... done
Running test ... done
Performance Statistics:
  number of SPEs     = 6
  execution time     = 1.90 seconds
  computation rate   = 152.24 GFlops/sec
  data transfer rate = 9.62 GBytes/sec

SDK 3.0では同様の条件で、139.36 GFlopsでしたので、かなり性能が向上しています。152.24 GFlopsは論理性能(153.6GFlops)の99%に達しており、いくらアセンブラでカリカリにチューニングしているとは言え、この値を信じてよいものか若干疑問ではありますが、、、

自作の行列和プログラムをSDK 3.1でコンパイルして実行したところ、SDK 3.0と同一の実行時間となったため、コンパイラの最適化レベルは上がっていないようです。SDK 3.0, 3.1ともgcc 4.1.1を使用しているため当然です。

と言う訳で、IDEを使用したPCのクロス環境を使う場合、SDK 3.1に切り替える価値はありだと思います。

« 2008年6月 | トップページ | 2008年12月 »

2018年10月
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      
無料ブログはココログ