分散レイトレースベンチ改

前回の分散レイトレースは、ピクセル毎にプロセスに依頼を出して結果を受け取るという
実装だったためメッセージが多すぎで分散による並列の恩恵を受けることができなかった。
これを改善するため行毎に依頼を出す方式に改めた。


結果はこんな感じ。いちおう分散成功といったところか。
まずはローカルのみの結果。

(xp1@192.168.0.10)13> timer:tc(dist_ray, start, ["tmp.bmp", 200, 3, [node(), node()]]).
waiting for boot servants...['xp1@192.168.0.10','xp1@192.168.0.10']
start rendering[<0.92.0>,<0.91.0>]
finished!
{34531000,ok}

プログラムは一緒なので前回とだいたい同じ結果に。


リモートのxpが一台参加。

(xp1@192.168.0.10)14> timer:tc(dist_ray, start, ["tmp.bmp", 200, 3, [node(), node(), 'xp2@192.168.0.11']]).
waiting for boot servants...['xp1@192.168.0.10','xp1@192.168.0.10', 'xp2@192.168.0.11']
start rendering[<5132.70.0>,<0.97.0>,<0.96.0>]
finished!
{27485000,ok}

34秒から27秒へ。7秒短縮。わりと効いた。


さらにosxが参加。

(xp1@192.168.0.10)15> timer:tc(dist_ray, start, ["tmp.bmp", 200, 3, [node(), node(), 'xp2@192.168.0.11', 'osx@192.168.0.12']]).
waiting for boot servants...['xp1@192.168.0.10','xp1@192.168.0.10', 'xp2@192.168.0.11','osx@192.168.0.12']
start rendering[<5803.67.0>,<5132.72.0>,<0.102.0>,<0.101.0>]
finished!
{24453000,ok}

27秒から24秒に。3秒短縮。いまいち。


さらにlinuxが参加。

(xp1@192.168.0.10)16> timer:tc(dist_ray, start, ["tmp.bmp", 200, 3, [node(), node(), 'xp2@192.168.0.11', 'osx@192.168.0.12', 'linux@192.168.0.13']]).
waiting for boot servants...['xp1@192.168.0.10','xp1@192.168.0.10', 'xp2@192.168.0.11','osx@192.168.0.12', 'linux@192.168.0.13']
start rendering[<5804.66.0>,<5803.69.0>,<5132.74.0>,<0.107.0>,<0.106.0>]
finished!
{22500000,ok}

24秒から22秒に。2秒短縮。ないよりましか。


今度はローカル+linux

(xp1@192.168.0.10)17> timer:tc(dist_ray, start, ["tmp.bmp", 200, 3, [node(), node(), 'linux@192.168.0.13']]).
waiting for boot servants...['xp1@192.168.0.10','xp1@192.168.0.10',
                             'linux@192.168.0.13']
start rendering[<5804.68.0>,<0.112.0>,<0.111.0>]
finished!
{31266000,ok}

31秒。3秒短縮。もともといまいちだった。


ついでにローカル+osx

(xp1@192.168.0.10)18> timer:tc(dist_ray, start, ["tmp.bmp", 200, 3, [node(), node(), 'osx@192.168.0.12']]).
waiting for boot servants...['xp1@192.168.0.10','xp1@192.168.0.10',
                             'osx@192.168.0.12']
start rendering[<5803.71.0>,<0.117.0>,<0.116.0>]
finished!
{29516000,ok}

29秒。5秒短縮。OSXに入っているErlangは1コアしか使えないのよね。Core Duoなのに。


200x200の画像で1行毎にメッセージを飛ばした結果こんな感じになりました。
前回の40000メッセージから200メッセージに劇的に減少。
20秒強で200メッセージだと1秒に10メッセージなんでまだ多い。

次は引数で何行ずつ送るかを指定できるようにして通信回数を減らしながら様子をみたいと思う。


今回のソースは
http://gunload.web.fc2.com/programming/erlang/index.html
に置いておきました。