yum update注意
今回はFedora7(Coreじゃないんですね)を使っている人向けの情報
ちょっとアドエスにうつつを抜かしていて久々にPS3を使った。
電源オフ問題もあるのでyum updateで最新版カーネルにならないかなーと思ったら2.6.22カーネルになりそう。喜び勇んでアップデートして再起動すると起動しません。
2chの初心者板にも書いてあるので俺だけではない様子。あちゃー。とりあえずkbootを調べるとcatコマンドで/etc/yaboot.confを確認できる。ひとつ前のカーネル設定も残っている。が、どうやって古いカーネルで起動するんや?kboot本家のサイトのドキュメントもよくわからなかった。
最悪DVDブートするLinuxでも使ってHDDのyaboot.confを修正するかと思ってFixstarsさんのHTTP-FUSEの説明ページで使いかたがわかった。全部書けばいいのだ。
こちらの環境で無事起動していたカーネルは2.6.21-1.3228.fc7。これはcat /etc/yaboot.confで確認できる。で、以下のコマンドを入力すると2.6.11カーネルが起動した。
kboot: /vmlinuz-2.6.21-1.3228.fc7 initrd=/initrd-2.6.21-1.3228.fc7.img root=/dev/VolGroup00/LogVol00
要は、cat /etc/yaboot.confを実行して内容を確認し、image=とinitrd=とroot=の部分を入力すればよい。最初のカーネルイメージだけはimage=が不要。
無事起動したら/etc/yaboot.confを修正し、2.6.21カーネル起動設定を先にすればよし。
カーネルはアップデートしない設定にしておいた方がいいかなー。
たのむよーFedoraちゃん。電源オフできない件といい、動作確認ちゃんとやってる?
libspe2化
あいかわらず時間がかかりましたが、libspe2対応にしました。サンプルコードやMigration Guideを見ながらコードを変更。ppuとspuとの同期にmailboxとeventを使っていたけど、libspe2だとeventがちょっとわかりにくかったのでmailboxだけにしてみた。が、ここではまった。
作りとしては、spu側はin_mboxから実行パラメータへのポインタが来るのを待ち、ppuは実行パラメータへのポインタをin_mboxへ書き込むだけ。以下の様に。
spe_in_mbox_write(spe_context,&arg,1,SPE_MBOX_ALL_BLOCKING);
で、argへのポインタをmailboxに書き込みたかったのです。が、このコードにはバグがある。この関数の2つ目のパラメータはmboxへ書き込むデータの配列なのだ。本当は3つ目のパラメータはこの配列の大きさを意味する。だから正しくは以下のようにする必要がある。
unsigned int mbox = &arg; spe_in_mbox_write(spe_context,&mbox,1,SPE_MBOX_ALL_BLOCKING);
という不具合に気がつくのに2週間かかりました。
結果詳細は書きませんが、libspe1より心持ち速くなっています。いいこっちゃ。
FC7
結局PS3にはFC7を入れました。いろいろ手間がかかったので書いておきます。
まずブートローダは昨年12月にインストールしてからアップデートしていませんでしたが、この状態ではFC6のminimum install途中でエラーが発生し、インストールできませんでした。この時点でやっとぐぐるとFIXSTARSさんのところでFC7がインストールできるとの説明を見つける。
で、まずはブートローダを5月16日版にアップデート。それでFC6を入れる。またもやminimum install。今回は成功したが、DHCPがうまく動いていない様子。固定IPにするとネットワークにつながったのでyum updateするとカーネルが古いからアップデートできないとか言われる。yum.confを見るとfedoraの標準カーネルはアップデート対象から外すようになっている。まぁ当然か。
どうせFC7がインストールできるようなので、FC7を入れることにする。まずはFC7のDVDイメージをダウンロードしてDVDを作る。が、なぜかDVDに焼いても失敗ばかり。3枚失敗した所でDVDを諦めて、この辺を参考にrescue-cdからインストール。httpでインストールにすると無線LANと勘違いしているようだったのでFTPにしたけど実はどちらも同じだった気がする。
インストールはできたけど少々問題が。
まずは、起動するときにspufsのマウントに失敗している。どうもSELinuxの権限設定がちゃんとできていない様子。いつもの癖でEnforceモードにしていたが、Permissiveモードだとマウントできている。面倒なのでDisableモードにしてしまう。いちおうこれで問題解決。いえ、本当はEnforceモードにすべきですが。
次はシャットダウンできない問題。シャットダウンの最後でps3fb_shutdownとかメッセージを出して止まってしまう。背面のスイッチで電源を切る羽目になる。実際に使う場合はPS3をssh経由で使って作業終了時にpoweroffコマンドでシャットダウンしているため、勝手に電源が切れないのは非常に面倒。ps3fb_shutdownをキーワードでぐぐると対策パッチがある様子。あるようですが、カーネルを置き換えるのも面倒なのでちょっと様子見。FC7のカーネルに取り込まれてくれればいいのですが。手でシャットダウンするのが面倒だったらカーネルをビルドしましょう。
で、最後にCell SDK 2.1をインストール。./cellsdk -installするといろいろ足りないパッケージが指摘されるので、そのとおりにインストールして無事完了。サンプルのビルドもとおり、libspe2も入っている様子。もう遅いのでx264を試すのは後日です。
と書いた所でこちらにも導入記が。皆さん同じですな。
libspe2
SDK2.1をインストールしました。ドキュメントをみるとlibspe2に移行しろというているし、こちらもlibspe2ベースになっているようなので、移行することにする。とりあえずビルドを通して実機で動かそうとすると動かん。libspe2.soがない。
いろいろぐぐるとどうも最初にPS3にFC5を入れてAddonパッケージを入れたときにlibspe1が入っただけの様子。その後SDK1.1も実機に入れたけどSDK2.0は入れていなかった。そのためlibspe2が入っていなかった?ずっとエミュレータでlibspe1ベースだったので気がつかなかった。
ということで実機にもSDK2.1を入れることにする。FC6じゃないけどいいか?と聞かれるがしょうがない。が、インストール途中でrtldがないといって怒られる。
さらにぐぐるとこのようなブログが。FC6を入れろということか。FC7も出たというのに。うー。
今日のところはおしまい。
6スレッド詳細
今回のパッチもいつもの場所に置きました。
今回はSPU化は動かすのが第一目的なので速度は二の次です。ですのでDMAでデータを取ってくる処理は全部完了待ちを入れながら処理しますし、SIMD化していません。ですが、せっかくなので速度を見てみます。確認データはいつものスパイダーマン2のtrailerです。長さは1分。
オリジナルコードはr656リビジョンになります。
- オリジナルコード 1スレッド
$ ./x264 -q 26 ../spiderman2.y4m -o spiderman2.ppu.264 yuv4mpeg: 720x480@29970029/1000000fps, 0:0 x264 [info]: using cpu capabilities Altivec x264 [info]: slice I:9 Avg QP:23.00 size: 11150 PSNR Mean Y:51.27 U:49.27 V:49.39 Avg:50.22 Global:44.05 x264 [info]: slice P:1783 Avg QP:26.00 size: 3911 PSNR Mean Y:42.51 U:41.15 V:42.11 Avg:42.05 Global:41.80 x264 [info]: mb I I16..4: 68.6% 0.0% 31.4% x264 [info]: mb P I16..4: 4.3% 0.0% 4.5% P16..4: 16.1% 6.8% 1.6% 0.0% 0.0% skip:66.6% x264 [info]: SSIM Mean Y:0.9736544 x264 [info]: PSNR Mean Y:42.551 U:41.194 V:42.149 Avg:42.090 Global:41.813 kb/s:946.33 encoded 1792 frames, 5.92 fps, 946.42 kb/s
- オリジナルコード 2スレッド
$ ./x264 --threads 2 -q 26 ../spiderman2.y4m -o spiderman2.ppu2.264 yuv4mpeg: 720x480@29970029/1000000fps, 0:0 x264 [info]: using cpu capabilities Altivec x264 [info]: slice I:25 Avg QP:23.00 size: 15437 PSNR Mean Y:46.90 U:44.88 V:45.71 Avg:46.11 Global:43.68 x264 [info]: slice P:1767 Avg QP:26.00 size: 3802 PSNR Mean Y:42.51 U:41.16 V:42.11 Avg:42.05 Global:41.81 x264 [info]: mb I I16..4: 63.9% 0.0% 36.1% x264 [info]: mb P I16..4: 4.1% 0.0% 4.2% P16..4: 16.2% 6.9% 1.6% 0.0% 0.0% skip:67.0% x264 [info]: SSIM Mean Y:0.9737038 x264 [info]: PSNR Mean Y:42.575 U:41.209 V:42.158 Avg:42.110 Global:41.827 kb/s:950.47 encoded 1792 frames, 8.11 fps, 950.63 kb/s
- オリジナル 6スレッド
$ ./x264 --threads 6 -q 26 ../spiderman2.y4m -o spiderman2.ppu6.264 yuv4mpeg: 720x480@29970029/1000000fps, 0:0 x264 [info]: using cpu capabilities Altivec x264 [info]: slice I:25 Avg QP:23.00 size: 15437 PSNR Mean Y:46.90 U:44.88 V:45.71 Avg:46.11 Global:43.68 x264 [info]: slice P:1767 Avg QP:26.00 size: 3802 PSNR Mean Y:42.52 U:41.16 V:42.11 Avg:42.05 Global:41.81 x264 [info]: mb I I16..4: 63.9% 0.0% 36.1% x264 [info]: mb P I16..4: 4.1% 0.0% 4.2% P16..4: 16.2% 6.9% 1.6% 0.0% 0.0% skip:67.0% x264 [info]: SSIM Mean Y:0.9737074 x264 [info]: PSNR Mean Y:42.577 U:41.208 V:42.158 Avg:42.110 Global:41.827 kb/s:950.47 encoded 1792 frames, 8.12 fps, 950.63 kb/s
1スレッド時の速度が去年の12月に測定したときより落ちています。2スレッドにするとかなり速度があがります。これはPPUがSMPで2コアあるためです。カーネル起動時にペンギンが2匹でているわけですし。ですが、当然6スレッドにしても速度は向上しません。
次は今回のSPU化の結果です。
- SPU化 1スレッド
$ ./x264 -q 26 ../spiderman2.y4m -o spiderman2.spu.264 yuv4mpeg: 720x480@29970029/1000000fps, 0:0 x264 [info]: using cpu capabilities Altivec ^[[B^[[Bx264 [info]: slice I:9 Avg QP:23.00 size: 11150 PSNR Mean Y:51.27 U:49.27 V:49.39 Avg:50.22 Global:44.05 x264 [info]: slice P:1783 Avg QP:26.00 size: 3911 PSNR Mean Y:42.51 U:41.15 V:42.11 Avg:42.05 Global:41.80 x264 [info]: mb I I16..4: 68.6% 0.0% 31.4% x264 [info]: mb P I16..4: 4.3% 0.0% 4.5% P16..4: 16.1% 6.8% 1.6% 0.0% 0.0% skip:66.6% x264 [info]: SSIM Mean Y:0.9736544 x264 [info]: PSNR Mean Y:42.551 U:41.194 V:42.149 Avg:42.090 Global:41.813 kb/s:946.33 encoded 1792 frames, 5.38 fps, 946.42 kb/s
- SPU化 2スレッド
$ ./x264 --threads 2 -q 26 ../spiderman2.y4m -o spiderman2.spu2.264 yuv4mpeg: 720x480@29970029/1000000fps, 0:0 x264 [info]: using cpu capabilities Altivec x264 [info]: slice I:25 Avg QP:23.00 size: 15437 PSNR Mean Y:46.90 U:44.88 V:45.71 Avg:46.11 Global:43.68 x264 [info]: slice P:1767 Avg QP:26.00 size: 3802 PSNR Mean Y:42.51 U:41.16 V:42.11 Avg:42.05 Global:41.81 x264 [info]: mb I I16..4: 63.9% 0.0% 36.1% x264 [info]: mb P I16..4: 4.1% 0.0% 4.2% P16..4: 16.2% 6.9% 1.6% 0.0% 0.0% skip:67.0% x264 [info]: SSIM Mean Y:0.9737038 x264 [info]: PSNR Mean Y:42.575 U:41.209 V:42.158 Avg:42.110 Global:41.827 kb/s:950.47 encoded 1792 frames, 8.04 fps, 950.63 kb/s
- SPU化 6スレッド
$ ./x264 --threads 6 -q 26 ../spiderman2.y4m -o spiderman2.spu6.264 yuv4mpeg: 720x480@29970029/1000000fps, 0:0 x264 [info]: using cpu capabilities Altivec x264 [info]: slice I:25 Avg QP:23.00 size: 15437 PSNR Mean Y:46.90 U:44.88 V:45.71 Avg:46.11 Global:43.68 x264 [info]: slice P:1767 Avg QP:26.00 size: 3802 PSNR Mean Y:42.52 U:41.16 V:42.11 Avg:42.05 Global:41.81 x264 [info]: mb I I16..4: 63.9% 0.0% 36.1% x264 [info]: mb P I16..4: 4.1% 0.0% 4.2% P16..4: 16.2% 6.9% 1.6% 0.0% 0.0% skip:67.0% x264 [info]: SSIM Mean Y:0.9737074 x264 [info]: PSNR Mean Y:42.577 U:41.208 V:42.158 Avg:42.110 Global:41.827 kb/s:950.47 encoded 1792 frames, 9.09 fps, 950.63 kb/s
1スレッドの場合PPUより落ちています。まー、コードを考えればしょうがないです。ですが、2スレッドにするとPPUに肉薄します。で、6スレッドにすると追い抜きます。いちおう6スレッド化による効果は出ているようです。
よかったよかった。次はSDK2.1を入れて、libspe2へ移行することも考えますかね。そいでもってPPU側の処理をできるだけ多くSPUへ持っていけばもうちっとましな速度になるかなー。
やっと動く
ひさびさの書き込みです。前回狙い所としたx264_frame_filter関数のSPU化した部分がやっと動きました。いやー長かった。いえとっくにSPUでは動いていたが、PPUだけで動かしたときと結果が違っていて何がまずいかずーと見ていたらワークエリアのスレッド用の構造体の部分が違っていて参照していた部分がずれていたのだ。
まだ公開できるレベルではないけど久しぶりにちゃんと動いてほっとしたという感じ。がんばりましょ。