0

MATLAB コードを高速化するいくつかのすばらしい方法を見つけました。ベクトル化、arrayfun、および基本的に for ループの除去 (parfor を使用しない) です。次のステップに持っていきたいです。

計算負荷の高い 2 つの関数呼び出しがあるとします。

x = fun(a);
y = fun(b);

それらは完全に独立しており、シリアルではなく並行して実行したいと考えています。並列処理ツールボックスを持っていません。どんな助けでも大歓迎です。

ありがとう

4

3 に答える 3

4

私が楽観的であれば、「Matlab で単純に並列処理を行うにはどうすればよいか」と尋ねると思います。その場合、答えは次のようになります。

並列処理は、並列計算ツールボックスを使用すると最も簡単に実行できます。これにより、次のようなものにアクセスできますparfor

私はあなたができると思います:

parfor t = 1:2
   if t == 1, x = fun(a); end
   if t == 2, y = fun(b); end
end

もちろん他の方法もありますが、それが最も簡単なはずです。

于 2013-10-02T08:53:03.413 に答える
0

通常の例には が含まれますがparfor、これはおそらく MATLAB の Parallel Computing Toolbox (PCT) から並列処理を引き出す最も簡単な方法です。この別の投稿parfevalで示されているように、関数は非常に簡単です。あまり議論されていない PCT の機能は、s とs のシステムです。これは、2 つの完全に独立した関数呼び出しの単純なケースにおそらく最も適したソリューションです。ネタバレ: このコマンドは、単純なジョブの作成を簡素化するのに役立ちます (この投稿の下部を参照)。jobtaskbatch

残念ながら、実装は簡単ではありません。完全を期すために、例を次に示します。

% 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 プロセスを起動するのに時間がかかることに注意してください。

于 2013-10-02T18:24:10.710 に答える