OpenMPでステレオブロックマッチングを並列化していたのですが、2次元の画像で並列化を考えると必ずどこかに次のようなループ構造ができます。
for(y=0; y<ysize; y++) //外側ループ
for(x=0; x<xsize; x++) //内側ループ
内側ループを並列化すると外側ループよりも並列化のための準備処理が外側ループの回数分必要になってしまい、縦軸探索の範囲が広い場合には余計な処理時間がかなり増えてしまうような気がしますが、どのくらい処理時間が違ってくるのかよく知りませんでした。
ということで試しに、ステレオブロックマッチングの縦横探索範囲を内側ループを並列化した場合と外側ループを並列化した場合のそれぞれの速度を計測してみました。
OS: Windows 7 64bit
CPU: Core i7-930
memory: 6GB
実験に使用した画像解像度: 397x410
探索範囲: x方向40pixel, y方向40pixel (1画素辺りの探索ループ回数は1600回)
以下が計測結果です。単位はsec。試行回数は少なすぎますが挙動を知りたかっただけなので5回としました。
実験結果からやはり内側よりも外側のループを並列化させた方が若干速くなるらしいということがわかりました。そんなに劇的な違いは見られなかったので、もしも、外側ループが極端に少ない場合などは内側ループを並列化しておいても問題はなさそうです。
それと、プログレスバーを使おうとするとやはり若干速度は遅くはなりますが、こちらもそんなに大きなロスはなさそうなので問題なく使えそうです。
for(y=0; y<ysize; y++) //外側ループ
for(x=0; x<xsize; x++) //内側ループ
内側ループを並列化すると外側ループよりも並列化のための準備処理が外側ループの回数分必要になってしまい、縦軸探索の範囲が広い場合には余計な処理時間がかなり増えてしまうような気がしますが、どのくらい処理時間が違ってくるのかよく知りませんでした。
ということで試しに、ステレオブロックマッチングの縦横探索範囲を内側ループを並列化した場合と外側ループを並列化した場合のそれぞれの速度を計測してみました。
OS: Windows 7 64bit
CPU: Core i7-930
memory: 6GB
実験に使用した画像解像度: 397x410
探索範囲: x方向40pixel, y方向40pixel (1画素辺りの探索ループ回数は1600回)
以下が計測結果です。単位はsec。試行回数は少なすぎますが挙動を知りたかっただけなので5回としました。
並列化なし
28.05
27.95
27.91
27.72
28.02
average: 27.93
内側ループの並列化
10.76
10.72
10.58
10.51
10.31
average: 10.576
外側ループの並列化
9.74
9.55
9.77
9.63
9.55
average: 9.648
内側ループ並列化+Qtのプログレスバー更新
11.06
10.83
10.92
10.95
11.0
average: 10.952
外側ループ並列化+Qtのプログレスバー更新
9.98
9.88
10.05
10.02
10.21
average: 10.028
実験結果からやはり内側よりも外側のループを並列化させた方が若干速くなるらしいということがわかりました。そんなに劇的な違いは見られなかったので、もしも、外側ループが極端に少ない場合などは内側ループを並列化しておいても問題はなさそうです。
それと、プログレスバーを使おうとするとやはり若干速度は遅くはなりますが、こちらもそんなに大きなロスはなさそうなので問題なく使えそうです。