MATLAB コードを高速化するいくつかのすばらしい方法を見つけました。ベクトル化、arrayfun、および基本的に for ループの除去 (parfor を使用しない) です。次のステップに持っていきたいです。
計算負荷の高い 2 つの関数呼び出しがあるとします。
x = fun(a);
y = fun(b);
それらは完全に独立しており、シリアルではなく並行して実行したいと考えています。並列処理ツールボックスを持っていません。どんな助けでも大歓迎です。
ありがとう
MATLAB コードを高速化するいくつかのすばらしい方法を見つけました。ベクトル化、arrayfun、および基本的に for ループの除去 (parfor を使用しない) です。次のステップに持っていきたいです。
計算負荷の高い 2 つの関数呼び出しがあるとします。
x = fun(a);
y = fun(b);
それらは完全に独立しており、シリアルではなく並行して実行したいと考えています。並列処理ツールボックスを持っていません。どんな助けでも大歓迎です。
ありがとう
私が楽観的であれば、「Matlab で単純に並列処理を行うにはどうすればよいか」と尋ねると思います。その場合、答えは次のようになります。
並列処理は、並列計算ツールボックスを使用すると最も簡単に実行できます。これにより、次のようなものにアクセスできますparfor
。
私はあなたができると思います:
parfor t = 1:2
if t == 1, x = fun(a); end
if t == 2, y = fun(b); end
end
もちろん他の方法もありますが、それが最も簡単なはずです。
通常の例には が含まれますがparfor
、これはおそらく MATLAB の Parallel Computing Toolbox (PCT) から並列処理を引き出す最も簡単な方法です。この別の投稿parfeval
で示されているように、関数は非常に簡単です。あまり議論されていない PCT の機能は、s とs のシステムです。これは、2 つの完全に独立した関数呼び出しの単純なケースにおそらく最も適したソリューションです。ネタバレ: このコマンドは、単純なジョブの作成を簡素化するのに役立ちます (この投稿の下部を参照)。job
task
batch
残念ながら、実装は簡単ではありません。完全を期すために、例を次に示します。
% Build a cluster from the default profile
c = parcluster();
% Create an independent job object
j = createJob(c);
% Use cells to pass inputs to the tasks
taskdataA = {field1varA,...};
taskdataB = {field1varB,...};
% Create the task with 2 outputs
nTaskOutputs = 2;
t = createTask(j, @myCoarseFunction, nTaskOutputs, {taskdataA, taskdataB});
% Start the job and wait for it to finish the tasks
submit(j); wait(j);
% Get the ouptuts from each task
taskoutput = get(t,'OutputArguments');
delete(j); % do not forget to remove the job or your APPDATA folder will fill up!
% Get the outputs
out1A = taskoutput{1}{1};
out1B = taskoutput{2}{1};
out2A = taskoutput{1}{2};
out2B = taskoutput{2}{2};
ここで重要なのは、作成するタスク オブジェクトで評価する関数として にmyCoarseFunction
与えられる関数です。構造体コンテナーを必要とする可能性のある複雑な入力/出力がある場合、createTask
これはあなたまたはラッパーになります。fun
単一のタスクの場合、ジョブとタスクを作成してから開始する上記のワークフロー全体は、次のように簡略化submit
できることに注意してください。batch
c = parcluster();
jobA = batch(c, @myCoarseFunction, 1, taskdataA,...
'Pool', c.NumWorkers / 2 - 1, 'CaptureDiary', true);
また、matlabpool
(現在は と呼ばれていますparpool
) と同様に、 を使用parcluster
すると、ジョブを実行する MATLAB.exe プロセスを起動するのに時間がかかることに注意してください。