13

(クラスターではなく) 単一のマシンで Octave の for ループを並列化したいです。少し前に Octave の並列バージョンについて質問しました Octave での 並列計算

その答えは、私が実行した並列計算パッケージをダウンロードすることを示唆していました。このパッケージは主にクラスター コンピューティングを対象としているように見えますが、単一マシンの並列コンピューティングについて言及していましたが、並列ループを実行する方法についても明確ではありませんでした。

これについてSOで別の質問も見つけましたが、Octaveでループを並列化するための良い答えが見つかりませんでした:Octaveと 並行してループの部分を実行していますか?

Octave で for ループを並列に実行する例がどこにあるか知っている人はいますか?

4

3 に答える 3

12

オクターブ ループは遅い、遅い、遅い、配列単位の操作で物事を表現する方がはるかに優れています。この3 次元オクターブ グラフィックスの例のように、2 次元ドメインで単純な三角関数を評価する例を見てみましょう(ただし、プロットとは対照的に、計算にはより現実的な点数を使用します)。

vectorized.m:

tic()
x = -2:0.01:2;
y = -2:0.01:2;
[xx,yy] = meshgrid(x,y);
z = sin(xx.^2-yy.^2);
toc()

これを for ループに変換すると、forloops.m が得られます。

tic()
x = -2:0.01:2;
y = -2:0.01:2;
z = zeros(401,401);
for i=1:401
    for j=1:401
        lx = x(i);
        ly = y(j);
        z(i,j) = sin(lx^2 - ly^2);
    endfor        
endfor
toc()

ベクトル化されたバージョンは、よりシンプルで読みやすいという点で既に「勝っている」ことに注意してください。しかし、別の重要な利点もあります。タイミングは劇的に異なります。

$ octave --quiet vectorized.m 
Elapsed time is 0.02057 seconds.

$ octave --quiet forloops.m 
Elapsed time is 2.45772 seconds.

したがって、for ループを使用していて、オーバーヘッドのない完全な並列処理を行っていた場合、非 for ループとのバランスを取るために、これを 119 個のプロセッサに分割する必要があります。

誤解しないでいただきたいのですが、並列処理は優れていますが、まずシリアルで効率的に動作するようにしてください。

octave の組み込み関数のほとんどすべては、スカラーまたは配列全体で同等に機能するという意味で、既にベクトル化されています。そのため、要素ごとに処理を行うのではなく、配列操作に変換する方が簡単な場合がよくあります。それほど簡単ではない場合は、通常、役立つユーティリティ関数 (2 つのベクトルのデカルト積から 2 次元グリッドを生成する meshgrid など) が既に存在することがわかります。

于 2012-05-10T22:25:51.630 に答える
4

pararrayfun使用例は http://wiki.octave.org/Parallel_packageにあります。

于 2014-08-21T17:35:43.020 に答える