<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>CELLプロセッサ</title>
    <link rel="alternate" type="text/html" href="http://blog.cell.sijam.com/" />
    <link rel="self" type="application/atom+xml" href="http://blog.cell.sijam.com/atom.xml" />
   <id>tag:blog.cell.sijam.com,2008://22</id>
    <link rel="service.post" type="application/atom+xml" href="http://www.sijam.com/cgi/mt/mt-atom.cgi/weblog/blog_id=22" title="222)CELLプロセッサ" />
    <updated>2008-05-12T08:16:14Z</updated>
    <subtitle>Cell プロセッサ用Linux カーネル、ライブラリ、アプリケーションの解析や新規ソフトウェアの開発</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type  3.31-ja</generator>
 
<entry>
    <title>x264 for cell r714 080501</title>
    <link rel="alternate" type="text/html" href="http://blog.cell.sijam.com/x264_for_cell_r714_080501/" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.sijam.com/cgi/mt/mt-atom.cgi/weblog/blog_id=22/entry_id=462" title="x264 for cell r714 080501" />
    <id>tag:blog.cell.sijam.com,2008://22.462</id>
    
    <published>2008-05-12T07:54:03Z</published>
    <updated>2008-05-12T08:16:14Z</updated>
    
    <summary> x264 for cell をバージョンアップしました。 patch-x264...</summary>
    <author>
        <name>CELLプロセッサ研究部門：浅井</name>
        <uri>http://cell.sijam.com</uri>
    </author>
            <category term="017)x264" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.cell.sijam.com/">
        <![CDATA[<p> x264 for cell をバージョンアップしました。</p>

<ul>
<li>
<a href="http://blog.cell.sijam.com/archive/patch-x264-cell-r714-080501.bz2">
patch-x264-cell-r714-080501.bz2 (1 patch)</a>
</li>
<li>
<a href="http://blog.cell.sijam.com/archive/patches-x264-cell-r714-080501.tar.bz2">
patches-x264-cell-r714-080501.tar.bz2 (series patch for quilt, stgit)</a>
</li>
</ul>

<p> 主な変更点としては、</p>

<ul>
<li> ベースを r635 から r714 に変更。ちなみに現在の最新バージョンは、
怒涛の更新により r839 なので、かなり古いものがベースです。
</li>
<li> SPE で動作するスレッド (x264_enc_thread_spu) を新しく作りました。こ
のスレッドでは encode、intra analyse や rd 系の関数を実行します。
</li>
</ul>

<h3> 使用ツールのインストール </h3>

<p> x264 のソース管理が subversion から git に変更されていますので、まず
は git (StGIT) をインストールして下さい。Fedora(rpm) 系では以下のように
します。
</p>

<pre>
$ yum install git stgit
</pre>

<h3> source tree の作成 </h3>

<p> 1 patch を使用する場合と、series patch を使用する場合の 2 通りの方
法を用意してありますのでお好きな方をどうぞ。
</p>

<h4> 1 patch を使用する場合 </h4>

<pre>
$ git clone git://git.videolan.org/x264.git
$ cd x264
$ git branch cell-r714 96a59591e1190a3b4dbcbae79f9b150f09977427
$ git checkout cell-r714
$ bzip2 -dc /hack/cell/x264-cell/patch-x264-cell-r714-080501.bz2 | patch -p1
</pre>

<h4> series patch を使用する場合 </h4>

<pre>
$ git clone git://git.videolan.org/x264.git
$ bzip2 -dc patches-x264-cell-r714-080501.tar.bz2 | tar xvf -
$ cd x264
$ stg branch -c cell-r714 96a59591e1190a3b4dbcbae79f9b150f09977427
$ stg import -s ../patches/series	# trailing whitespace warning が出ます
</pre>

<h3> 実行ファイルの作成 </h3>

<p> 実行ファイルは以下のようにして作成出来ます。PC の場合も configure を
PS3 上で行うことで作成される config.mak, config.h が必要です。
</p>

<pre>
$ ./configure				# PS3 上で実行
$ make cell
</pre>

<p> これで実行ファイル x264 (ppe), x264_{me,enc}_thread_spu (spe) が出来
ます。
</p>
]]>
        
    </content>
</entry>
<entry>
    <title>make sched_yield more agressive</title>
    <link rel="alternate" type="text/html" href="http://blog.cell.sijam.com/make_sched_yield_more_agressiv/" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.sijam.com/cgi/mt/mt-atom.cgi/weblog/blog_id=22/entry_id=460" title="make sched_yield more agressive" />
    <id>tag:blog.cell.sijam.com,2008://22.460</id>
    
    <published>2008-02-05T10:46:49Z</published>
    <updated>2008-02-05T12:20:41Z</updated>
    
    <summary> linux kernel v2.6.23 から Completely Fair...</summary>
    <author>
        <name>CELLプロセッサ研究部門：浅井</name>
        <uri>http://cell.sijam.com</uri>
    </author>
            <category term="011)linux" />
            <category term="017)x264" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.cell.sijam.com/">
        <![CDATA[<p> linux kernel v2.6.23 から Completely Fair Scheduler (CFS) という新しいスケジューラが導入
されましたが、これに伴い sched_yield() の挙動が大幅に変更されています。簡単に言うと、スレッド
が sched_yield() を発行すると、次回のスレッド実行が以前のバージョンの kernel と較べると遅くなります。で、以前
と同じ挙動にするためには以下のように kernel を設定すれば良いようです。</p>

<pre>
echo 1 > /proc/sys/kernel/sched_compat_yield
</pre>

<p>また、関連する commit は以下になります。</p>

<ul>
<li>
<a href="http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=1799e35d5baab6e06168b46cc78b968e728ea3d1">
sched: add /proc/sys/kernel/sched_compat_yield</a>
</li>
</ul>

<p> x264 for cell でも sched_yield() は多用しており、v2.6.21 から v2.6.23 にバージョンを上げた
時に速度が低下したため、しばらくは v2.6.21 を使用していました。
が、v2.6.21 は正常にリブート出来ない上に nfs の使用に難があるため、やっぱり v2.6.23 を使用
しようということで kernel source を調べて判明しています。で、原因が sched_yield() にあると
分かって念のため google してみるとすでに以下の記事があってガックリなわけですが、、</p>

<ul>
<li>
<a href="http://www.atmarkit.co.jp/flinux/rensai/watch2007/watch12b.html">
Linux Kernel Watch 12 月版: 望ましい挙動とは？　sched_yieldを巡る議論</a>
</li>
<li>
<a href="http://kerneltrap.org/Linux/CFS_and_sched_yield">
KernelTrap: CFS and sched_yield</a>
</li>
</ul>

<h3> x264 for cell ではどう sched_yield() を使用している？</h3>

<p> x264 for cell では PPE <-> SPE 間通信が 多対一 となっているため、PPE->SPE は SPU シグナルが使用出来ますが、SPE->PPE は、複数の PPE スレッドが一つの SPE スレッドに対して待ち状態
になっているため、SPU アウトバウンド(割り込み)メールボックスを使用しようとすると、pthread の
cond や mutex を組み合わせて複雑な通信方式を実現しなければならないからです。
この代わりとして、 SPE が処理終了時にメモリを変更するので、このメモリを PPE で監視して、
未終了なら sched_yield() するようにしています。
(つまり PPE<->SPE 間で mutex, cond 等を実現する場合と同じことをしています)
速度や実現性を考えると kernel のドライバを作成するというのも考えていますが、、
</p>

<h3> 他の Cell 用ソフトでは？ </h3>

<p> fixstars 社で公開されている
<a href="http://cell.fixstars.com/ctk/index.php/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8">
CTK: Cell ToolKit Library</a>
でも PPE-SPE 間で使用可能な mutex, cond, queue 等を実現するために使用しています。(source としては以下の辺り)</p>
<pre>
./ctk/sync/ppu/ctk_mutex-impl.h
./ctk/sync/ppu/ctk_sem-impl.h
./ctk/sync/ppu/ctk_cond-impl.h
./ctk/sync/ppu/ctk_genericq-impl.h
./ctk/sync/ppu/ctk_barrier-impl.h
./ctk/sync/ppu/ctk_queue-impl.h
</pre>

<p> また、SPE 側では sched_yield() に該当する箇所で random delay させており、スラッシング
しないように工夫されています。</p>

<p> 逆に、Cell SDK 内で提供されている libsync の mutex, cond では sched_yield() は使用せず、
スピンロックする(実行権を放棄しない)ようです。</p>

<h3> sched_yield() は使うべき？使わないべき？ </h3>

<p> 状況による、というありきたりな答えになってしまいますが、
mutex, cond によるロック期間が短ければ sched_yield() を使用しないほうが有利、ロック期間
が長かったり、PPE 上で複数のスレッドが動作する場合は sched_yield() を使用したほうが有利
という感じになるのかな、、</p>
]]>
        
    </content>
</entry>
<entry>
    <title>fix x264_macroblock_analyse and x264_mb_analyse_p_rd functions</title>
    <link rel="alternate" type="text/html" href="http://blog.cell.sijam.com/fix_x264_macroblock_analyse_an/" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.sijam.com/cgi/mt/mt-atom.cgi/weblog/blog_id=22/entry_id=459" title="fix x264_macroblock_analyse and x264_mb_analyse_p_rd functions" />
    <id>tag:blog.cell.sijam.com,2008://22.459</id>
    
    <published>2008-02-01T14:03:55Z</published>
    <updated>2008-02-01T14:48:35Z</updated>
    
    <summary> 前回の blog で書いたとおり、 x264-devel ML にバグ修正 p...</summary>
    <author>
        <name>CELLプロセッサ研究部門：浅井</name>
        <uri>http://cell.sijam.com</uri>
    </author>
            <category term="017)x264" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.cell.sijam.com/">
        <![CDATA[<p> 前回の blog で書いたとおり、 x264-devel ML にバグ修正 patch を送ったのですが、
結局、何の反応もありません。 commit されないんだろうなぁとあきらめていましたが、
先日、何の前触れもなく commit されてました。</p>

<a href="http://mailman.videolan.org/pipermail/x264-devel/2007-November/003820.html">
[x264-devel] fix x264_mb_analyse_inter_p4x4_chroma and checkasm</a>

<p> それなら他にもバグらしきものがあるので送ってみようということで、以下のバグ修正 patch を送っています。</p>

<a href="http://mailman.videolan.org/pipermail/x264-devel/2008-January/004016.html">
[x264-devel] fix x264_macroblock_analyse and x264_mb_analyse_p_rd functions</a>

<p> この修正も 8x4, 4x8, 4x4 のサブマクロブロックに関するもので、Cell 対応の過程で発見したものです。どれも非常にわかりにくい修正なので何か反応が欲しいところですが、ML 上ではやっぱり反応なしです。</p>
]]>
        
    </content>
</entry>
<entry>
    <title>fix x264_mb_analyse_inter_p4x4_chroma and checkasm</title>
    <link rel="alternate" type="text/html" href="http://blog.cell.sijam.com/fix_x264_mb_analyse_inter_p4x4/" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.sijam.com/cgi/mt/mt-atom.cgi/weblog/blog_id=22/entry_id=454" title="fix x264_mb_analyse_inter_p4x4_chroma and checkasm" />
    <id>tag:blog.cell.sijam.com,2007://22.454</id>
    
    <published>2007-12-07T09:27:27Z</published>
    <updated>2007-12-07T10:12:44Z</updated>
    
    <summary> x264-devel ML にバグ修正 patch を送っています。 [x26...</summary>
    <author>
        <name>CELLプロセッサ研究部門：浅井</name>
        <uri>http://cell.sijam.com</uri>
    </author>
            <category term="017)x264" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.cell.sijam.com/">
        <![CDATA[<p> x264-devel ML にバグ修正 patch を送っています。</p>

<a href="http://mailman.videolan.org/pipermail/x264-devel/2007-November/003820.html">
[x264-devel] fix x264_mb_analyse_inter_p4x4_chroma and checkasm</a>

<p> で、patch の内容ですが、</p>

<ol>
<li> サブマクロブロック 4x4 の動きベクトル探索後の chroma 生成に関するバグ
</li>
<li> idct4x4dc 関数のテスト実行条件に関するバグ
</li>
<li> quant 系関数テスト時のメモリ未開放に関するバグ (GBクラスのメモリを持つ PC では問題に
なりませんが、256KB しかメモリがない SPU ではガッツリ発現します、、ハマりました)
</li>
<li> intra predict 系関数テストで、関数がバグっている場合に表示されるメッセージに関するバグ
</li>
</ol>

<p> というように本体の修正や、SPU 用の各種関数を作成する上で見つけたものです。
で、このメールを出したのは 11/22 なんですが、全く誰からも反応なしです。
確かに 1 以外はテスト用のもので、1 に関しても p4x4、それも chroma が対象で、patch を適用しても
エンコード結果にほとんど影響しないのですが、バグじゃないのかなあ、、</p>

<p> 他にもバグらしきものが数点あり、そのうちでも堅いと思われる修正を出したつもり
なのですが、どうするかな、、</p>
]]>
        
    </content>
</entry>
<entry>
    <title>PPU 用 hpel_filter, ssd, ssim 関数</title>
    <link rel="alternate" type="text/html" href="http://blog.cell.sijam.com/ppu_hpel_filter_ssd_ssim/" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.sijam.com/cgi/mt/mt-atom.cgi/weblog/blog_id=22/entry_id=448" title="PPU 用 hpel_filter, ssd, ssim 関数" />
    <id>tag:blog.cell.sijam.com,2007://22.448</id>
    
    <published>2007-11-21T08:33:41Z</published>
    <updated>2007-11-21T08:52:29Z</updated>
    
    <summary> x264-devel ML に PPU 向けの patch を送っています(c...</summary>
    <author>
        <name>CELLプロセッサ研究部門：浅井</name>
        <uri>http://cell.sijam.com</uri>
    </author>
            <category term="017)x264" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.cell.sijam.com/">
        <![CDATA[<p> x264-devel ML に PPU 向けの patch を送っています(commit 済み)。</p>

<a href="http://mailman.videolan.org/pipermail/x264-devel/2007-November/003785.html">
[x264-devel] add optimised functions (hpel_filter, ssd, ssim)</a>

<p> 今回の patch に含まれる 3 関数は、(エンコード用オプションを色々と追加した場合、)
それほど負荷があるわけではないため、SPU化の優先順位は非常に低いのですが、
現状では PPU への負担が大きいため、この負担を軽くするのが目的です。</p>
]]>
        
    </content>
</entry>
<entry>
    <title>blog 再開</title>
    <link rel="alternate" type="text/html" href="http://blog.cell.sijam.com/blog/" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.sijam.com/cgi/mt/mt-atom.cgi/weblog/blog_id=22/entry_id=443" title="blog 再開" />
    <id>tag:blog.cell.sijam.com,2007://22.443</id>
    
    <published>2007-11-13T08:22:26Z</published>
    <updated>2007-11-13T09:24:35Z</updated>
    
    <summary> 久々の更新です。前回の更新が 6 月下旬だったので、もう止めてしまったのかと思...</summary>
    <author>
        <name>CELLプロセッサ研究部門：浅井</name>
        <uri>http://cell.sijam.com</uri>
    </author>
            <category term="017)x264" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.cell.sijam.com/">
        <![CDATA[<p> 久々の更新です。前回の更新が 6 月下旬だったので、もう止めてしまったのかと思われた方
も多いと思いますが、、、</p>

<p> 前回の更新後、ずっと DCT, 量子化、ジグザグスキャン等を行う x264_macroblock_encode()
の SPU 化を検討していました。が、検討を進めていくと芋づる式に trellis や rd 系の処理も必要に
なってきて、そうすると256KBオーバーになり、ずっと頭を抱えていました。で、余裕がなくなり、blog の
更新も止まるという悪循環に、、blog は継続することが重要なのに、イザとなるとなかなか出来ない
ですね。</p>

<p> 現在は一応の目処がついたので、実装を進めています。</p>

<p> ということで、上記の検討で SPU 用の関数を実装する上で、 PPU(Altivec) の関数を幾つか
実装したので、それを x264-devel ML に送って本体に反映してもらっている所です(commit 済み)。</p>

<a href="http://mailman.videolan.org/pipermail/x264-devel/2007-November/003740.html">
[x264-devel] add optimised functions</a>
]]>
        
    </content>
</entry>
<entry>
    <title>google-perftools と fedora version</title>
    <link rel="alternate" type="text/html" href="http://blog.cell.sijam.com/googleperftools_fedora_version/" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.sijam.com/cgi/mt/mt-atom.cgi/weblog/blog_id=22/entry_id=374" title="google-perftools と fedora version" />
    <id>tag:blog.cell.sijam.com,2007://22.374</id>
    
    <published>2007-06-20T11:02:29Z</published>
    <updated>2007-06-20T11:03:34Z</updated>
    
    <summary> 現在、Cell(PPE) 用のプロファイラーとしては主に google-per...</summary>
    <author>
        <name>CELLプロセッサ研究部門：浅井</name>
        <uri>http://cell.sijam.com</uri>
    </author>
            <category term="018)tools" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.cell.sijam.com/">
        <![CDATA[<p> 現在、Cell(PPE) 用のプロファイラーとしては主に google-perftools を使っ
ています。プロファイラーとしては他にも、gprof とか、oprofile とかあるので
すが、</p>

<ul>
<li> gprof のように関数の出入口でイベントを取るタイプだと、PPE でのソフト
の動作が変わる (遅くなる) ため、マルチコアの Cell では、他のプロセッサ
(SPE) とのタイミングがずれてしまう。
</li>

<li> oprofile は、kernel 内のイベントも取ってくれるので、kernel 内の動作
が見たいときは便利だが、PS3 用に用意されている kernel では disable になっ
ており、callgraph が (v2.6.16) では使用できない、他のソフトのイベントも
一緒に取るので結果が見づらい。
</li>
</ul>

<p> ということで、残った google-perftools を使っています。これも
callgraph がおかしかったり、変数が関数として表れたり、怪しいところがあり
ますが。</p>

<p> で、この google-perftools、FC5 の時にはよく使っていたのですが、FC6 に
した後、しばらく使用しておらず、久々に使うにあたっててこずったため、現象
をまとめておこうと思います。</p>

<p> なお、SDK は 2.1 を使用し、x264 を 32bit でコンパイルしているため、
google-perftools 自体も PS3 上で以下のようにして configure と make をして
います。</p>

<pre>
$ ./configure CC=ppu-gcc CXX=ppu-g++ CFLAGS=-m32 CXXFLAGS=-m32
$ make
</pre>

<h3> google-perftools-0.8  + FC5 </h3>

<p> google-perftools 自体のコンパイル、x264 とのリンクが出来ていました。</p>

<h3> google-perftools-0.8  + FC6 </h3>

<p> google-perftools 自体のコンパイルは出来るのですが、x264 とリンクしよ
うとすると、以下のようなエラーが出ます。</p>

<pre>
$ ppu-gcc -o x264 x264.o matroska.o muxers.o libx264.a -lm -m32 -lspe2 -lpthread -lprofiler
/usr/lib/libstdc++.so.6: undefined reference to `_Unwind_GetIPInfo@GCC_4.2.0'
collect2: ld returned 1 exit status
$
</pre>

<p> マズイなあと思ったのですが、ダメ元で toolchain を SDK 2.1 (ppu-gcc)
から FC6 (gcc) に代えてコンパイル (リンク) してみると、</p>

<pre>
$ gcc -o x264 x264.o matroska.o muxers.o libx264.a -lm -m32 -lspe2 -lpthread -lprofiler
$
</pre>

<p> 出来ました、、実行させてみましたが、エンコード結果も同じになるので、
正しく動作しているようです。

<p> 予想としては、エラーメッセージの GCC_4.2.0 から toolchain のバージョ
ンの差によるものかなとは思っていますが、判明していません。ま
た、_Unwind_GetIPInfo と出ていまずが、x86 の場合はスタック解析用に
libunwind というライブラリの使用を推奨しているようです。</p>

<p> ちなみに FC6 の toolchain のバージョンは gcc-4.1.1-30、
binutils-2.17.50.0.3-6 で FC6 インストール時と同じ、SDK 2.1 のバージョン
は ppu-gcc-4.1.1-10、ppu-binutils-2.17.50-8 です。</p>

<h3> google-perftools-0.91 + FC6 </h3>

<p> google-perftools 自体のコンパイルが出来ません。調べてみると
google-perftools は x86 上でしか動作しなくなったよう (solaris は不明) で、
Fedora ppc 用 rpm も 0.8 までしかないようです。

<a href="http://groups.google.com/group/google-perftools/browse_thread/thread/418eecc026bcd0ca">
ML のログ</a>

を見ると、PPC MAC OS X 用の patch が流れていましたが、適用しても PS3 で
はコンパイル出来ず、、</p>

<h3> ということで、</h3>

<p> 現在は、x264 と google-perftools-0.8 は SDK 2.1 の toolchain でコンパ
イルして、プロファイルしたい時は、FC6 の toolchain でリンクのみしています。
</p>

<p> Fedora 7 もリリースされていて、この件が判明するまでは、おりを見てイン
ストールしようと思っていましたが、思案中です。調べてみると、Fedora 7 の
toolchain のバージョンは、gcc-4.1.2-12、binutils-2.17.50.0.12-4 で、FC6
とは違いますね、、</p>]]>
        
    </content>
</entry>
<entry>
    <title>x264 for cell 070530 part.2: 性能評価</title>
    <link rel="alternate" type="text/html" href="http://blog.cell.sijam.com/x264_for_cell_070530_part2/" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.sijam.com/cgi/mt/mt-atom.cgi/weblog/blog_id=22/entry_id=373" title="x264 for cell 070530 part.2: 性能評価" />
    <id>tag:blog.cell.sijam.com,2007://22.373</id>
    
    <published>2007-06-02T11:49:07Z</published>
    <updated>2007-06-02T14:46:16Z</updated>
    
    <summary> r635 070530 版の性能についてまとめました。  テスト条件   前回...</summary>
    <author>
        <name>CELLプロセッサ研究部門：浅井</name>
        <uri>http://cell.sijam.com</uri>
    </author>
            <category term="017)x264" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.cell.sijam.com/">
        <![CDATA[<p> r635 070530 版の性能についてまとめました。</p>

<h3> テスト条件 </h3>

<p> 前回同様、テスト用の動画は
<a href="ftp://ftp.tnt.uni-hannover.de/pub/svc/testsequences/avc_anchors/SOCCER_704x576_60_avc_3000.yuv">
SOCCER_704x576_60_avc_3000.yuv</a>
を使用し、以下のように動きベクトル探索を最大限行うようオプションを付けて実行しています。
</p>

<pre>
$ ./x264 --bframes 3 --ref 5 --mixed-refs -A all --me umh --bime -m 7 --8x8dct \
         --threads (thread num) SOCCER_704x576_60_avc_3000.yuv -o (出力ファイル名)
</pre>

<h3> Cell 対応による速度の変化 </h3>

<p> x264 を Cell 対応することで、速度がどうなったか？また、実際に SPE を使用
することで速度がどうなったかです。version は以下を表し、
速度の指標は x264 自体がエンコード後に出力する fps (frames per second) を使用します。
</p>

<ul>
<li> r635: rev:635 オリジナル版
</li>
<li> r635 070530 cell sim: rev:635 070530 の Cell 対応 (sim) 版
</li>
<li> <strong> r635 070530 cell: rev:635 070530 の Cell 対応版 </strong>
</li>
<li> r635 070530 cell sim: rev:635 070412 の Cell 対応 (sim) 版
</li>
<li> r635 070530 cell: rev:635 070412 の Cell 対応版
</li>
</ul>

<table cellspacing="1" cellpadding="1" border="1">
<tbody>
<tr align="center">
<th width="80"> CPU/SPE </th>
<th width="100"> version </th>
<th> thread num </th>
<th width="70"> fps </th>
</tr>
<tr align="center"><td> 1PPE/6SPE        </td><td> r635 070412 cell     </td><td rowspan="6"> 1 </td>
<td> 1.28 fps </td></tr>
<tr align="center"><td> 1PPE             </td><td> r635                 </td>
<td> 1.44 fps </td></tr>
<tr align="center">
<td><strong> 1PPE/6SPE        </strong></td>
<td><strong> r635 070530 cell     </strong></td>
<td><strong> 1.90 fps </strong></td></tr>
<tr align="center"><td> core2duo (E6600) </td><td> r635 070412 cell sim </td>
<td> 2.70 fps </td></tr>
<tr align="center"><td> core2duo (E6600) </td><td> r635 070530 cell sim </td>
<td> 3.55 fps </td></tr>
<tr align="center"><td> core2duo (E6600) </td><td> r635                 </td>
<td> 6.39 fps </td></tr>
</tbody>
</table>

<p> やっと 1PPE r635 よりも速くなりましたが、今回から載せている core2duo
r635 と比べるとまだまだという状況です。</p>

<h3> スレッド数増加による速度変化 </h3>

<p> x264 の --threads オプションで同時に処理するフレーム数 (thread num) を変化させた
場合の結果です。</p>

<table cellspacing="1" cellpadding="1" border="1">
<tbody>
<tr align="center">
<th rowspan="2" width="80"> CPU/SPE </th>
<th rowspan="2" width="100"> version </th>
<th colspan="6"> thread num </th>
</tr>
<tr align="center">
<th width="75"> 1 </th>
<th width="75"> 2 </th>
<th width="75"> 3 </th>
<th width="75"> 4 </th>
<th width="75"> 5 </th>
<th width="75"> 6 </th>
</tr>
<tr align="center">
<td> 1PPE/6SPE </td><td> r635 070412 cell </td>
<td> 1.28 fps </td><td> 1.55 fps </td><td> 1.94 fps </td><td> 2.04 fps </td><td> 2.06 fps </td><td> 2.06 fps </td>
</tr>
<tr align="center">
<td> 1PPE </td><td> r635 </td>
<td> 1.44 fps </td><td> 1.77 fps </td><td> 2.02 fps </td><td> 2.10 fps </td><td> 2.09 fps </td><td> 2.09 fps </td>
</tr>
<tr align="center">
<td><strong> 1PPE/6SPE </strong></td><td><strong> r635 070530 cell </strong></td>
<td><strong> 1.90 fps </strong></td><td><strong> 2.30 fps </strong></td>
<td><strong> 2.88 fps </strong></td><td><strong> 3.02 fps </strong></td>
<td><strong> 3.14 fps </strong></td><td><strong> 3.16 fps </strong></td>
</tr>
<tr align="center">
<td> core2duo (E6600) </td><td> r635 </td>
<td> 6.39 fps </td><td> 9.12 fps </td><td> 12.44 fps </td><td> 13.09 fps </td><td> 13.12 fps </td><td> 13.15 fps </td>
</tr>
</tbody>
</table>

<p> core2duo r635 は、4GB の RAM を積んでいるため、入力ファイル全体
(360MB) がキャッシュされてしまい、2 回目以降の実行ではディスクアクセスが
ほとんど発生しません (しかし、PS3 の RAM は 256MB なのでキャッシュは有効
に働かないと予想される)。。キャッシュによる高速化は、正確には Cell とは関
係ありませんが、キャッシュされた場合のデータを掲載しています。</p>

<p> thread 数が 4 以降でも若干ながら高速にはなりますが、大枠では PPE の
SMT による高速化率 (1.5 倍) による制約が大きいため、もっと SPE 側に処理
自体を移動させる必要があります。<p>

<h3> SPE の稼働率 </h3>

<ul>
<li> active rate: SPE で何らかの命令を実行している時間の割合。
</li>
<li> proc rate: 上記でかつ、(DMA 転送待ちに関連しない) 命令を実行してい
る時間の割合。
</li>
<li> SPE 有効稼働率: SPE が有効な演算をしている時間の割合。各 SPE の
active rate * proc rate / 100 の平均値を載せています。
</li>
</ul>

<table cellspacing="1" cellpadding="1" border="1">
<tbody>
<tr align="center">
<th width="100"> thread num </th>
<th width="70"> SPE num </th>
<th width="80"> active rate </th>
<th width="80"> proc rate </th>
<th width="100"> SPE 有効稼働率 </th>
</tr>
<tr align="center"><td rowspan="6"> 1 </th><td> 0 </th><td>  10.49 % </td><td> 67.89 % </td>
<td rowspan="6"><strong> 6.89 % </strong></td></tr>
<tr align="center">                        <td> 1 </td><td>   9.84 % </td><td> 67.84 % </td></tr>
<tr align="center">                        <td> 2 </td><td>   9.83 % </td><td> 68.27 % </td></tr>
<tr align="center">                        <td> 3 </td><td>  10.45 % </td><td> 67.76 % </td></tr>
<tr align="center">                        <td> 4 </td><td>  10.00 % </td><td> 68.03 % </td></tr>
<tr align="center">                        <td> 5 </td><td>  10.30 % </td><td> 67.68 % </td></tr>

<tr align="center"><td rowspan="6"> 2 </th><td> 0 </th><td> 12.32 % </td><td> 67.75 % </td>
<td rowspan="6"><strong> 8.31 % </strong></td></tr>
<tr align="center">                        <td> 1 </td><td> 11.39 % </td><td> 68.31 % </td></tr>
<tr align="center">                        <td> 2 </td><td> 12.71 % </td><td> 67.89 % </td></tr>
<tr align="center">                        <td> 3 </td><td> 11.88 % </td><td> 68.26 % </td></tr>
<tr align="center">                        <td> 4 </td><td> 12.53 % </td><td> 67.91 % </td></tr>
<tr align="center">                        <td> 5 </td><td> 12.43 % </td><td> 68.27 % </td></tr>

<tr align="center"><td rowspan="6"> 3 </th><td> 0 </td><td> 15.64 % </td><td> 66.90 % </td>
<td rowspan="6"><strong> 10.43 % </strong></td></tr>
<tr align="center">                        <td> 1 </td><td> 14.40 % </td><td> 67.19 % </td></tr>
<tr align="center">                        <td> 2 </td><td> 16.48 % </td><td> 66.72 % </td></tr>
<tr align="center">                        <td> 3 </td><td> 15.37 % </td><td> 66.87 % </td></tr>
<tr align="center">                        <td> 4 </td><td> 15.67 % </td><td> 67.23 % </td></tr>
<tr align="center">                        <td> 5 </td><td> 15.86 % </td><td> 67.09 % </td></tr>

<tr align="center"><td rowspan="6"> 4 </th><td> 0 </td><td> 16.34 % </td><td> 66.71 % </td>
<td rowspan="6"><strong> 10.94 % </strong></td></tr>
<tr align="center">                        <td> 1 </td><td> 15.18 % </td><td> 66.91 % </td></tr>
<tr align="center">                        <td> 2 </td><td> 17.13 % </td><td> 66.69 % </td></tr>
<tr align="center">                        <td> 3 </td><td> 16.31 % </td><td> 66.52 % </td></tr>
<tr align="center">                        <td> 4 </td><td> 16.71 % </td><td> 66.87 % </td></tr>
<tr align="center">                        <td> 5 </td><td> 16.67 % </td><td> 66.80 % </td></tr>

<tr align="center"><td rowspan="6"> 5 </th><td> 0 </td><td> 17.31 % </td><td> 66.14 % </td>
<td rowspan="6"><strong> 11.40 % </strong></td></tr>
<tr align="center">                        <td> 1 </td><td> 16.02 % </td><td> 66.46 % </td></tr>
<tr align="center">                        <td> 2 </td><td> 17.90 % </td><td> 66.34 % </td></tr>
<tr align="center">                        <td> 3 </td><td> 16.79 % </td><td> 66.43 % </td></tr>
<tr align="center">                        <td> 4 </td><td> 17.63 % </td><td> 66.36 % </td></tr>
<tr align="center">                        <td> 5 </td><td> 17.46 % </td><td> 66.54 % </td></tr>

<tr align="center"><td rowspan="6"> 6 </th><td> 0 </td><td> 17.21 % </td><td> 67.07 % </td>
<td rowspan="6"><strong> 11.52 % </strong></td></tr>
<tr align="center">                        <td> 1 </td><td> 16.12 % </td><td> 66.85 % </td></tr>
<tr align="center">                        <td> 2 </td><td> 17.84 % </td><td> 67.14 % </td></tr>
<tr align="center">                        <td> 3 </td><td> 16.93 % </td><td> 66.75 % </td></tr>
<tr align="center">                        <td> 4 </td><td> 17.53 % </td><td> 67.22 % </td></tr>
<tr align="center">                        <td> 5 </td><td> 17.64 % </td><td> 66.85 % </td></tr>
</tbody>
</table>

<p> proc rate が前バージョンから改善 (57% -> 67%) されていますが、このバー
ジョンから DMA リスト自体を分割して複数の DMA リストとし、リストの作成と
転送を並列に行うようにしており、この変更による所が大きいです。</p>
]]>
        
    </content>
</entry>
<entry>
    <title>x264 for cell 070530</title>
    <link rel="alternate" type="text/html" href="http://blog.cell.sijam.com/x264_for_cell_070530/" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.sijam.com/cgi/mt/mt-atom.cgi/weblog/blog_id=22/entry_id=372" title="x264 for cell 070530" />
    <id>tag:blog.cell.sijam.com,2007://22.372</id>
    
    <published>2007-05-30T09:53:32Z</published>
    <updated>2007-05-30T11:03:41Z</updated>
    
    <summary> x264 for cell をバージョンアップしました。 patch-x264...</summary>
    <author>
        <name>CELLプロセッサ研究部門：浅井</name>
        <uri>http://cell.sijam.com</uri>
    </author>
            <category term="017)x264" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.cell.sijam.com/">
        <![CDATA[<p> x264 for cell をバージョンアップしました。</p>

<ul>
<li>
<a href="http://blog.cell.sijam.com/archive/patch-x264-cell-r635-070530.bz2">
patch-x264-cell-r635-070530.bz2</a>
</li>
<li>
<a href="http://blog.cell.sijam.com/archive/patches-x264-cell-r635-070530.tar.bz2">
patches-x264-cell-r635-070530.tar.bz2 (for quilt, stgit)</a>
</li>
</ul>

<p> 変更点としては、</p>

<ul>
<li> 動きベクトル探索を行う時には、最初に幾つかのベクトルの初期値候補から適切な初期値
を決定します 。前バージョンまでは PPE で行っていたこの処理を、SPE で行うようにしました。
</li>
<li> 各 SPE は、整数画素単位の探索用に 256x192 画像を 2 枚分持っていましたが、大きさと枚数
を変更して、128x128 画像を 6 枚分持つようにしています。また履歴管理は LRU で行っています。
</li>
<li> 1/2, 1/4 画素単位の探索用画像を転送する時に、マクロブロックのタイプを考慮して画像の
大きさを決定することで、転送量を削減しました。
</li>
<li> PPE - SPE 間の通信データを更新タイミング毎に分割し、適切なタイミングで更新する
ようにしました。
</li>
<li> DMA リストの作成を組み込み関数 ( spu_*() ) を使用して高速化しました。
</li>
<li> プロファイル機能を見直して、DMA 転送待ち時間が正確に取れるようにしました。
</li>
</ul>

<p> コンパイルは PS3 FC6 + SDK 2.1 と x86 Linux PC + SDK 2.1 で確
認してあります。上記の patch をダウンロードして、以下のように x264 r635 
に patch を適用して make することで実行バイナリが出来ます。(PC の場合も 
configure を PS3 上で行うことで作成される config.mak が必要です)</p>

<pre>
$ svn co -r 635 svn://svn.videolan.org/x264/trunk x264
$ cd x264
$ bzip2 -dc ../patch-x264-cell-r635-070530.bz2 | patch -p1
$ ./configure
$ make cell
</pre>
]]>
        
    </content>
</entry>
<entry>
    <title>x264 for cell 070412 part.2: 性能評価</title>
    <link rel="alternate" type="text/html" href="http://blog.cell.sijam.com/x264_for_cell_070412_part2/" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.sijam.com/cgi/mt/mt-atom.cgi/weblog/blog_id=22/entry_id=371" title="x264 for cell 070412 part.2: 性能評価" />
    <id>tag:blog.cell.sijam.com,2007://22.371</id>
    
    <published>2007-04-17T13:36:30Z</published>
    <updated>2007-04-17T14:48:49Z</updated>
    
    <summary> 今回は、パフォーマンス計測機能の出力結果を元に、現バージョンの性能をまとめて ...</summary>
    <author>
        <name>CELLプロセッサ研究部門：浅井</name>
        <uri>http://cell.sijam.com</uri>
    </author>
            <category term="017)x264" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.cell.sijam.com/">
        <![CDATA[<p> 今回は、パフォーマンス計測機能の出力結果を元に、現バージョンの性能をまとめて
おきます。

<h3> x264 for cell (070412) の概要 </h3>

<p> SPE 用のコードを CPU で動作させる SPE シミュレーションモード
(sim) を持っています。具体的に何をしているかと言うと、

<ul>
<li> DMA 転送 は memcpy() で代用</li>
<li> mailbox (SPE への処理依頼) は 関数呼び出し で代用</li>
<li> 各 SPE で同時に複数の処理が動作しないように排他制御 (pthread_mutex
使用)</li>
<li> 各 SPE が個別に持つリソースの管理</li>
<li> SPE 専用のコードと同等の処理を行う CPU 版のコードを用意 (x264 自体
が対応)
</ul>

<p> です。最初から SPE での動作を目指すと、実際に動作し始めるまでの難関
(メモリの制限や複雑な DMA 転送) が多いため、バグが取れずに挫折する可能性
が高いと感じ、このモードを付けています。このモードにより、実際の開発はほ
とんど Linux PC 上で行っており、結果を確かめながら変更していくことが出来
ました。但し、ソースが非常に複雑 (#ifdef の嵐)になってしまっています。
</p>

<p> 上記の複雑な DMA 転送というのは、参照画像から実際に動きベクトル探索で
利用する部分を切り出す処理に相当するのですが、具体的には以下の 2 つです
(当然、他にもDMA 転送しているデータはあります)。</p>

<ul>
<li> 192 line の DMA リスト転送 (整数画素単位の動きベクトル探索用に
256x192 の輝度部分画像 1 枚分)
</li>
<li> 120 line の DMA リスト転送 (1/2, 1/4 画素単位の動きベクトル探索用に
48x24 の輝度部分画像 4 枚分と 32x12 の色差部分画像 2 枚分 (24*4+12*2) )
</li>
</ul>

<p> 両者ともに画像の切り出し位置は、DMA の 16byte アラインを考慮して SPE
側で計算しています (CPU 側が SPE で使用しているデータを把握していないとい
うことです。デバッグ時はこれが一番問題に、、)。</p>

<p> また、両者ともに DMA 転送する画像の切り出し位置が処理の直前にしかわか
らない、かつ、前者は DMA リスト転送するかどうかを判定する場所が複数ありま
す。よって、(ようするに非常に複雑なので) ダブルバッファ等を使用することで
転送中も演算処理を行って転送時間を隠蔽するのが高速化の基本ですが、現在の
バージョンでは行っていません。</p>

<p> 各 SPE への処理の割り当ては、基本的には符号化対象画像毎に割り当ててい
ますが、P (前方参照のみ) の場合と B (前方参照と後方参照) の場合で、処理量
の差が約 2 倍 ( P>B ) ありましたので、何番目の参照画像かも考慮することで
処理量を平均化しています。</p>

<h3> テスト条件 </h3>

<p> テスト用の動画は
<a href="ftp://ftp.tnt.uni-hannover.de/pub/svc/testsequences/avc_anchors/SOCCER_704x576_60_avc_3000.yuv">
SOCCER_704x576_60_avc_3000.yuv</a>
を使用し、以下のように動きベクトル探索を最大限行うようオプションを付けて実行しています。
</p>

<pre>
$ ./x264 --bframes 3 --ref 5 --mixed-refs -A all --me umh --bime -m 7 --8x8dct \
         --threads (thread num) SOCCER_704x576_60_avc_3000.yuv -o (出力ファイル名)
</pre>

<h3> Cell 対応による速度の変化 </h3>

<p> まずは、x264 を Cell 対応することで、速度がどうなったか？また、実際に SPE を使用
することで速度がどうなったかです。version は以下を表し、
速度の指標は x264 自体がエンコード後に出力する fps (frames per second) を使用します。
</p>

<ul>
<li> r635: rev:635 オリジナル版
</li>
<li> r635 cell sim: rev:635 の Cell 対応 (sim) 版
</li>
<li> r635 cell: rev:635 の Cell 対応版
</li>
</ul>

<table cellspacing="1" cellpadding="1" border="1">
<tbody>
<tr align="center">
<th width="80"> CPU/SPE </th>
<th width="100"> version </th>
<th> thread num </th>
<th width="70"> fps </th>
</tr>
<tr align="center"><td> 1PPE             </td><td> r635          </td><td rowspan="4"> 1 </td><td> 1.44 fps </td></tr>
<tr align="center"><td> 1PPE             </td><td> r635 cell sim </td>                        <td> 0.56 fps </td></tr>
<tr align="center"><td> 1PPE/6SPE        </td><td> r635 cell     </td>                        <td> 1.28 fps </td></tr>
<tr align="center"><td> core2duo (E6600) </td><td> r635 cell sim </td>                        <td> 2.70 fps </td></tr>
</tbody>
</table>

<p> 以上のように、Cell 対応をすることで、速度が約 1/3 (1.44 -> 0.56) になっていますが、
実際に SPE を使用することで挽回 (0.56 -> 1.28) しています。現状、それでも 1PPE の
ほうが速いわけですが、、参考までに core2duo (E6600) での結果も載せていま
す、、完敗してます。</p>

<p> また、処理のほとんどを SPE に移した関数 (x264_me_search_ref()) の時間を
 google performance tool で測定してみましたが、実行時間に対する割合は
 55% (r635) -> 40% (r635 cell) ということであまり減っていません。
これは、以下の理由が挙げられます。</p>

<ul>
<li> SPE に処理を依頼するためのパケットの複製 (オリジナルでは複製する必要が
ない) に時間がかかっている。
</li>
<li> PPE 側に残した処理は、使用するデータのランダム性が高いため、キャッ
シュミスが大量に発生している。
</li>
<li> sched_yield() 呼びすぎ (PPE が SPE に依頼する処理としては粒度が小さいすぎる)。
</li>
</ul>


<h3> スレッド数増加による速度変化 </h3>

<p> 次に x264 の --threads オプションで同時に処理するフレーム数 (thread num) を変化させた
場合の結果です。</p>

<table cellspacing="1" cellpadding="1" border="1">
<tbody>
<tr align="center">
<th rowspan="2" width="80"> CPU/SPE </th>
<th rowspan="2" width="80"> version </th>
<th colspan="6"> thread num </th>
</tr>
<tr align="center">
<th width="80"> 1 </th>
<th width="80"> 2 </th>
<th width="80"> 3 </th>
<th width="80"> 4 </th>
<th width="80"> 5 </th>
<th width="80"> 6 </th>
</tr>
<tr align="center">
<td> 1PPE </td><td> r635 </td>
<td> 1.44 fps </td><td> 1.77 fps </td><td> 2.02 fps </td><td> 2.10 fps </td><td> 2.09 fps </td><td> 2.09 fps </td>
</tr>
<tr align="center">
<td> 1PPE/6SPE </td><td> r635 cell </td>
<td> 1.28 fps </td><td> 1.55 fps </td><td> 1.94 fps </td><td> 2.04 fps </td><td> 2.06 fps </td><td> 2.06 fps </td>
</tr>
</tbody>
</table>

<p> このように thread 数が多くなると 1PPE r635 でも SMT が効いて速くなり
ますが、thread 数が増えるにつれて r635 cell 版も 6 SPE が有効に働くよう
になり、両者がほぼ同じ (やや負け) 位の速度でエンコード出来るようになって
います。</p>


<h3> SPE の稼働率 </h3>

<p> 最後は、じゃあ SPE はどのくらい有効に働いているの？ですが、</p>

<ul>
<li> active rate: SPE で何らかの命令を実行している時間の割合。
</li>
<li> proc rate: 上記でかつ、(DMA 転送待ちに関連しない) 命令を実行してい
る時間の割合。
</li>
</ul>

<p>とすると、thread オプションに対する各 SPE の active rate, proc rate
は以下のようになります。</p>

<table cellspacing="1" cellpadding="1" border="1">
<tbody>
<tr align="center">
<th width="100"> thread num </th>
<th width="70"> SPE num </th>
<th width="100"> active rate </th>
<th width="100"> proc rate </th>
</tr>
<tr align="center"><td rowspan="6"> 1 </th><td> 0 </th><td>  8.785670 % </td><td> 56.992781 % </td></tr>
<tr align="center">                        <td> 1 </td><td>  7.836577 % </td><td> 62.490412 % </td></tr>
<tr align="center">                        <td> 2 </td><td>  9.204857 % </td><td> 59.048293 % </td></tr>
<tr align="center">                        <td> 3 </td><td>  7.165960 % </td><td> 62.844794 % </td></tr>
<tr align="center">                        <td> 4 </td><td>  8.986283 % </td><td> 59.062187 % </td></tr>
<tr align="center">                        <td> 5 </td><td>  7.035920 % </td><td> 63.182083 % </td></tr>

<tr align="center"><td rowspan="6"> 2 </th><td> 0 </th><td> 10.107968 % </td><td> 58.416470 % </td></tr>
<tr align="center">                        <td> 1 </td><td> 10.614589 % </td><td> 57.817723 % </td></tr>
<tr align="center">                        <td> 2 </td><td> 10.468447 % </td><td> 58.328175 % </td></tr>
<tr align="center">                        <td> 3 </td><td> 10.941708 % </td><td> 57.527256 % </td></tr>
<tr align="center">                        <td> 4 </td><td>  9.579995 % </td><td> 58.968929 % </td></tr>
<tr align="center">                        <td> 5 </td><td> 11.060721 % </td><td> 57.915997 % </td></tr>

<tr align="center"><td rowspan="6"> 3 </th><td> 0 </td><td> 13.042938 % </td><td> 56.386892 % </td></tr>
<tr align="center">                        <td> 1 </td><td> 13.761920 % </td><td> 56.516727 % </td></tr>
<tr align="center">                        <td> 2 </td><td> 13.516308 % </td><td> 57.191141 % </td></tr>
<tr align="center">                        <td> 3 </td><td> 14.277174 % </td><td> 56.623944 % </td></tr>
<tr align="center">                        <td> 4 </td><td> 12.060944 % </td><td> 55.693047 % </td></tr>
<tr align="center">                        <td> 5 </td><td> 14.179765 % </td><td> 56.892087 % </td></tr>

<tr align="center"><td rowspan="6"> 4 </th><td> 0 </td><td> 13.767162 % </td><td> 57.188217 % </td></tr>
<tr align="center">                        <td> 1 </td><td> 13.889416 % </td><td> 55.032239 % </td></tr>
<tr align="center">                        <td> 2 </td><td> 14.238510 % </td><td> 57.168836 % </td></tr>
<tr align="center">                        <td> 3 </td><td> 14.951388 % </td><td> 56.861344 % </td></tr>
<tr align="center">                        <td> 4 </td><td> 13.150053 % </td><td> 57.438491 % </td></tr>
<tr align="center">                        <td> 5 </td><td> 14.789294 % </td><td> 56.637078 % </td></tr>

<tr align="center"><td rowspan="6"> 5 </th><td> 0 </td><td> 14.068798 % </td><td> 56.949056 % </td></tr>
<tr align="center">                        <td> 1 </td><td> 14.711695 % </td><td> 56.617446 % </td></tr>
<tr align="center">                        <td> 2 </td><td> 14.316511 % </td><td> 56.909902 % </td></tr>
<tr align="center">                        <td> 3 </td><td> 15.203619 % </td><td> 56.853118 % </td></tr>
<tr align="center">                        <td> 4 </td><td> 13.312675 % </td><td> 57.666773 % </td></tr>
<tr align="center">                        <td> 5 </td><td> 15.163975 % </td><td> 57.012929 % </td></tr>

<tr align="center"><td rowspan="6"> 6 </th><td> 0 </td><td> 14.075775 % </td><td> 57.279934 % </td></tr>
<tr align="center">                        <td> 1 </td><td> 14.796232 % </td><td> 56.791326 % </td></tr>
<tr align="center">                        <td> 2 </td><td> 14.559752 % </td><td> 57.344442 % </td></tr>
<tr align="center">                        <td> 3 </td><td> 14.659463 % </td><td> 55.245073 % </td></tr>
<tr align="center">                        <td> 4 </td><td> 13.371265 % </td><td> 57.493847 % </td></tr>
<tr align="center">                        <td> 5 </td><td> 15.155458 % </td><td> 57.292702 % </td></tr>
</tbody>
</table>

<p> --bframes や --ref オプションの値にもよりますが、各 SPE への処理の
平均化は全体的にはうまくいっているようです。</p>

<p> SPE が有効な演算をしている割合 (有効稼働率) は active rate * proc
rate / 100 となりますが、thread 数が 6 の時の SPE 有効稼働率は、平均
active rate を 14.5 %、平均 proc rate を 57 % とすると、 
14.5 * 57 / 100 = 8.25 % ということになります。</p>]]>
        
    </content>
</entry>
<entry>
    <title>x264 for cell 070412</title>
    <link rel="alternate" type="text/html" href="http://blog.cell.sijam.com/x264_for_cell_070412/" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.sijam.com/cgi/mt/mt-atom.cgi/weblog/blog_id=22/entry_id=370" title="x264 for cell 070412" />
    <id>tag:blog.cell.sijam.com,2007://22.370</id>
    
    <published>2007-04-12T07:05:41Z</published>
    <updated>2007-04-12T07:28:35Z</updated>
    
    <summary> x264 for cell をバージョンアップしました。 patch-x264...</summary>
    <author>
        <name>CELLプロセッサ研究部門：浅井</name>
        <uri>http://cell.sijam.com</uri>
    </author>
            <category term="017)x264" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.cell.sijam.com/">
        <![CDATA[<p> x264 for cell をバージョンアップしました。</p>

<ul>
<li>
<a href="http://blog.cell.sijam.com/archive/patch-x264-cell-r635-070412.bz2">
patch-x264-cell-r635-070412.bz2</a>
</li>
<li>
<a href="http://blog.cell.sijam.com/archive/patches-x264-cell-r635-070412.tar.bz2">
patches-x264-cell-r635-070412.tar.bz2 (for quilt, stgit)</a>
</li>
</ul>

<p> 主な変更点としては、</p>

<ul>
<li> 画像サイズの制限に関するバグ修正 (174x144, 352x288, 704x576 で確認) 。
</li>
<li> PPE 側の処理の最適化に関するバグ修正。
</li>
</ul>

<p> ちなみにテストで主に使用している動画は、H.264 規格の標準化で使用され
たと思われる
<a href="ftp://ftp.tnt.uni-hannover.de/pub/svc/testsequences/avc_anchors/">
ココ</a>
の動画の一番動きの激しいもの (SOCCER_*.yuv) を使用しています。</p>

<p> コンパイルは PS3 + SDK 2.0 (+ libspe2) と x86 Linux PC + SDK 2.1 で確
認してあります。上記の patch をダウンロードして、x264 r635 に適用して下さ
い。後は以下を実行することでバイナリが出来ます。</p>

<pre>
$ ./configure
$ make cell
</pre>]]>
        
    </content>
</entry>
<entry>
    <title>x264 for cell 070411</title>
    <link rel="alternate" type="text/html" href="http://blog.cell.sijam.com/x264_for_cell_070411/" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.sijam.com/cgi/mt/mt-atom.cgi/weblog/blog_id=22/entry_id=368" title="x264 for cell 070411" />
    <id>tag:blog.cell.sijam.com,2007://22.368</id>
    
    <published>2007-04-11T04:08:56Z</published>
    <updated>2007-04-11T04:56:58Z</updated>
    
    <summary> x264 for cell をバージョンアップしました。 patch-x264...</summary>
    <author>
        <name>CELLプロセッサ研究部門：浅井</name>
        <uri>http://cell.sijam.com</uri>
    </author>
            <category term="017)x264" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.cell.sijam.com/">
        <![CDATA[<p> x264 for cell をバージョンアップしました。</p>

<ul>
<li>
<a href="http://blog.cell.sijam.com/archive/patch-x264-cell-r635-070411.bz2">
patch-x264-cell-r635-070411.bz2</a>
</li>
<li>
<a href="http://blog.cell.sijam.com/archive/patches-x264-cell-r635-070411.tar.bz2">
patches-x264-cell-r635-070411.tar.bz2 (for quilt, stgit)</a>
</li>
</ul>

<p> 主な変更点としては、</p>

<ul>
<li> 幾つかのバグ修正 。
</li>
<li> パフォーマンス計測機能の追加 (SPE で行う各種処理の実行時間や DMA 実
行時間を計測して表示します)。
</li>
<li> PPE 側の処理の最適化 (SPE への処理の割り当て方法や sched_yield() に
よるスケジューリングの最適化)。
</li>
</ul>

<p> 上記で最適化とありますが、SPE 側は何を追加するにしても大規模な変更が
必要であるため、こちらは変更せずに PPE で出来る範囲で最適化してあります。</p>

<p> コンパイルは PS3 + SDK 2.0 (+ libspe2) と x86 Linux PC + SDK 2.1 で確
認してあります。上記の patch をダウンロードして、x264 r635 に適用して下さ
い。後は以下を実行することでバイナリが出来ます。</p>

<pre>
$ ./configure
$ make cell
</pre>]]>
        
    </content>
</entry>
<entry>
    <title>Cell SDK 2.1 インストール (Momonga rev:15290)</title>
    <link rel="alternate" type="text/html" href="http://blog.cell.sijam.com/cell_sdk_21_momonga_rev15290/" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.sijam.com/cgi/mt/mt-atom.cgi/weblog/blog_id=22/entry_id=367" title="Cell SDK 2.1 インストール (Momonga rev:15290)" />
    <id>tag:blog.cell.sijam.com,2007://22.367</id>
    
    <published>2007-04-04T07:35:26Z</published>
    <updated>2007-04-04T08:01:52Z</updated>
    
    <summary> Cell SDK 2.1 がリリースされましたので、Momonga trunk...</summary>
    <author>
        <name>CELLプロセッサ研究部門：浅井</name>
        <uri>http://cell.sijam.com</uri>
    </author>
            <category term="016)overlay" />
            <category term="017)x264" />
            <category term="023)Momonga" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.cell.sijam.com/">
        <![CDATA[<p> Cell SDK 2.1 がリリースされましたので、Momonga trunk rev:15290 にインストールしました。と言ってもベースは Fedora に近いので、なんの問題もなく toolchain のインストールとサンプル等のコンパイルができてます。</p>

<p> で、肝心の Cell SDK 2.0 との差分ですが、先日リリースした x264 for cell を 2.0, 2.1 でコンパイルして、spu  用のバイナリを readelf したところ、printf() 等の newlib 関連の関数のサイズには違いがありましたが、x264 の関数のサイズには違いはありませんでした。</p>

<p> 但し、spu overlays のサンプル (overlay) の spu 用バイナリを objdump -d してみると、overlay 用に toolchain が用意するコードが若干変わっているようです (se.o は相変わらず、非 overlay section です)。</p>]]>
        
    </content>
</entry>
<entry>
    <title>x264 for cell 070331</title>
    <link rel="alternate" type="text/html" href="http://blog.cell.sijam.com/x264_for_cell_070331/" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.sijam.com/cgi/mt/mt-atom.cgi/weblog/blog_id=22/entry_id=366" title="x264 for cell 070331" />
    <id>tag:blog.cell.sijam.com,2007://22.366</id>
    
    <published>2007-03-31T14:50:00Z</published>
    <updated>2007-03-31T14:57:30Z</updated>
    
    <summary> Cell 上で x264 が動作するようになりました。とは言っても SPE が...</summary>
    <author>
        <name>CELLプロセッサ研究部門：浅井</name>
        <uri>http://cell.sijam.com</uri>
    </author>
            <category term="017)x264" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.cell.sijam.com/">
        <![CDATA[<p> Cell 上で x264 が動作するようになりました。とは言っても SPE が行うの
は動きベクトル探索のみで、SPE も有効に使えてないので速くないです (つまり、
とりあえず動きましたレベル)。</p>

<ul>
<li>
<a href="http://blog.cell.sijam.com/archive/patch-x264-cell-r635-070331.bz2">
patch-x264-cell-r635-070331.bz2</a>
</li>
<li>
<a href="http://blog.cell.sijam.com/archive/patches-x264-cell-r635-070331.tar.bz2">
patches-x264-cell-r635-070331.tar.bz2 (for quilt, stgit)</a>
</li>
</ul>

<p> コンパイル環境は PS3 + SDK 2.0 を想定しており、libspe2 が必要です。ま
ずは上記の patch をダウンロードして、x264 r635 に適用して下さい
(2007/03/31 の trunk は r636 ですが、PPC でコンパイルできないので一つ古い
revision です)。あとは、</p>

<pre>
$ ./configure
$ make cell
</pre>

<p> すれば、怪しげな warning が沢山でますが、x264 と SPE 上で動作する
x264_me_thread_spu が出来ます。あとは、通常と同様に x264 を実行すればデバッ
グメッセージと共に SPE を使用してエンコードします (多分、400x300 以上の画
像でないと動きません)。</p>

<p> 詳しい説明等は来週以降ということで、、</p>]]>
        
    </content>
</entry>
<entry>
    <title>Patches for Toshiba Cell reference set are merged</title>
    <link rel="alternate" type="text/html" href="http://blog.cell.sijam.com/patches_for_toshiba_cell_refer_1/" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.sijam.com/cgi/mt/mt-atom.cgi/weblog/blog_id=22/entry_id=364" title="Patches for Toshiba Cell reference set are merged" />
    <id>tag:blog.cell.sijam.com,2007://22.364</id>
    
    <published>2007-02-13T07:03:55Z</published>
    <updated>2007-02-13T08:26:44Z</updated>
    
    <summary> 先週から 2.6.21 の新機能マージ期間が始まっていますが、とうとう TOS...</summary>
    <author>
        <name>CELLプロセッサ研究部門：浅井</name>
        <uri>http://cell.sijam.com</uri>
    </author>
            <category term="011)linux" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.cell.sijam.com/">
        <![CDATA[<p> 先週から 2.6.21 の新機能マージ期間が始まっていますが、とうとう
TOSHIBA のリファレンスセット (Celleb) 向けの patch が linus tree にマージされまし
た。</p>
<p> 他にも PS3 用 の usb, fb/av driver のマージも行われています。ただ、
net や logo 関連でまだマージされていないものが幾つかあるようので PS3 で
はまだ使用できないと思います (Linuxppc-dev ML を追いきれてません、、)。 </p>
<p>ともあれ、詳細は以下をご覧下さい。</p>

<ul>
<li>
<a href="http://repo.or.cz/w?p=linux-2.6.git&a=search&h=HEAD&st=commit&s=ps3">
ps3 で linus tree を検索</a>
</li>
</ul>

<ul>
<li>
<a href="http://repo.or.cz/w?p=linux-2.6.git&a=search&h=HEAD&st=commit&s=Ishizaki+Kou">
Celleb commiter name で linus tree を検索</a>
</li>
</ul>]]>
        
    </content>
</entry>

</feed> 

