![](https://blogimg.goo.ne.jp/user_image/2d/dc/bbc9fd2373cc6ea9a95a4cd8a668d346.jpg)
初めて触れた Cell プログラムでもある月刊 ASCII に載っていた
マンデルブロ描画のプログラムを CellSDK2.1、libspe2 用に書き直すことにした。
ちなみにマンデルブロ集合は次の漸化式
z[n+1] = z[n]^2 + c
z[0] = 0
で定義される複素数列 {z[n]} n∈N が n → ∞ の極限で
無限大に発散しないという条件を満たす複素数 c 全体が作る集合のことである。
次のような漸化式にすることで、複素数を用いなくても求めることができる。
今回のプログラムもこの形式を利用している。
x[n+1] = x[n]^2 - y[n]^2 + a
y[n+1] = 2x[n]y[n] + b
さて、Cell プログラムは複数のコンパイル方法があるが、
make.footer を用いた方法はどの環境でも同様に make できるので重宝している。
マンデルブロ描画は計算量が多いため、スレッド起動のオーバーヘッドが全体に占める割合はかなり小さい。
先日の内積プログラムでは、実行時間が数ミリ秒であるのでスレッド起動の時間が効いてきてしまう。これでは Cell のポテンシャルを引き出すのは難しい。double であることも影響しているのだろう。単純な演算で速度を出すのは難しいようだ。float ver. も作成し、比較してみよう。
以下が実行結果である。
SPE time とは、PPE 側から計測した SPE の実行時間だが、
スレッド起動等も入っているので、実質の計算時間であると思ってよいだろう。
処理には SIMD を用いていないだが、単一 CPU でこの早さはすごい。
$ time ./mandel > sample.ppm
Default Value is used
==================================================
C = (-0.750000, 0.000000), width = 2.500000
size : 512
SPE time : 257.824048[msec]
Total SPE time : 1486.337769 [msec]
==================================================
real 0m0.646s
user 0m0.614s
sys 0m0.032s
マンデルブロ描画のプログラムを CellSDK2.1、libspe2 用に書き直すことにした。
ちなみにマンデルブロ集合は次の漸化式
z[n+1] = z[n]^2 + c
z[0] = 0
で定義される複素数列 {z[n]} n∈N が n → ∞ の極限で
無限大に発散しないという条件を満たす複素数 c 全体が作る集合のことである。
次のような漸化式にすることで、複素数を用いなくても求めることができる。
今回のプログラムもこの形式を利用している。
x[n+1] = x[n]^2 - y[n]^2 + a
y[n+1] = 2x[n]y[n] + b
さて、Cell プログラムは複数のコンパイル方法があるが、
make.footer を用いた方法はどの環境でも同様に make できるので重宝している。
マンデルブロ描画は計算量が多いため、スレッド起動のオーバーヘッドが全体に占める割合はかなり小さい。
先日の内積プログラムでは、実行時間が数ミリ秒であるのでスレッド起動の時間が効いてきてしまう。これでは Cell のポテンシャルを引き出すのは難しい。double であることも影響しているのだろう。単純な演算で速度を出すのは難しいようだ。float ver. も作成し、比較してみよう。
以下が実行結果である。
SPE time とは、PPE 側から計測した SPE の実行時間だが、
スレッド起動等も入っているので、実質の計算時間であると思ってよいだろう。
処理には SIMD を用いていないだが、単一 CPU でこの早さはすごい。
$ time ./mandel > sample.ppm
Default Value is used
==================================================
C = (-0.750000, 0.000000), width = 2.500000
size : 512
SPE time : 257.824048[msec]
Total SPE time : 1486.337769 [msec]
==================================================
real 0m0.646s
user 0m0.614s
sys 0m0.032s
PS3で少々個人的に研究しているのですが、なかなか上手くいかず詰まっているので参考にさせていただきたいのですが
申し訳ありませんが、マンデルブロのプログラムには致命的なバグがありますので、あまりお見せしたくないのです。
Flag 変数を用いたスタイルではうまく同期を取れてなく、2度同じ行の処理をしてしまい、結果計算されてない行(黒く筋が入ってしまう)が出来てしまいます。
不躾なお願いに対して、丁寧な返答ありがとうございました。