(22) parforは使えるけど使えない

投稿者: | 2013/09/12

4,731 views

この記事は最終更新から 1809日 が経過しています。

MATLABの Parallel Computing Toolboxでは、for ループを parfor に書き換えるだけでマルチコア並列化が実現できる。
このプログラムをそのまま Octave上で実行すると、エラーは発生しないが、高速化もしない…

Octave公式Wiki には、「3.6.N seriesで parforを認識するようになった」とある。

What's new in Octave
[edit] What's new in version series 3.6.N and 3.7.N of Octave
Several new features have been added to the 3.6.N series. The full details are in the NEWS file, but in brief 3.6.N series brings: 
 Perl compatible regular expressions 
 A profiler has been added. 
 Broadcasting enabled for all built-in binary element-wise operators. 
 The statistical distribution functions have been overhauled. 
 The functions strread(), textscan(), and textread() have been rewritten. 
 Performance of all m-file string functions has been improved. 
 The qhull geometry functions have been revamped. 
 Date/time functions have been updated. 
 Matlab compatible preference functions have been added. 
 Various handle graphics functions have been introduced. 
 The parfor keyword is now recognized. ←コレ

すなわち、キーワードとして認識する(=エラーとしない)だけで、実際の動作は forと同じく1プロセスのようだ。

MATLABとOctaveでプログラムを共通化できないが、Octaveで MATLABの parfor相当のことを実現したい場合、
pararrayfun
parcellfun
を使用することができる。

これを使うと、

function ret = calc( a, b )
    ret = a + b;
endfunction

のような関数を4並列処理したい場合に、

ret = paraarrayfun( 4, @calc, a, b )

と書くと、Octaveを4プロセス起動して並列処理してくれる。
※スレッド並列ではなく Octaveプロセスを新たに起動している。

parforでループカウンタをキーに並列処理するのとと同じく、
各処理で配列 a, bのインデックスをキーに並列処理してくれる。

ただし…
オーバーヘッドがかなり大きいので適用箇所を間違えると低速化する。


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です