0

私は 4 つの物理コアを備えたラップトップと、MatLab 並列計算ツールボックスを持っています。私は2つの独立したタスクを実行する必要があります(非常に高価です。たとえば、密で大規模な行列の最大の固有値を計算するとしましょう)。

したがって、次の方法でタスクをコアに分散したいと考えています。

  • 最初のタスクで 2 コア
  • 2 番目のタスクで 2 コア

しかし、これをMatLabコードで設定する方法を本当に理解/見つけることができません。

よく検索した結果、 を使用する必要があることがわかりましたが、同じタスクに 2 つのコアspmdを使用できる適切な例がドキュメントに見つかりません。

MatLab での最小限の作業例は本当にありがたいです!

ダニエルのコメントの後の編集: 4 つのワーカーの並列プールを作成した後、次のことができます。

 spmd
     if labindex == 1 
        %first worker, do something             
     elseif labindex == 2
         %second worker, do sometihng
     end   
 end

編集(2)

を設定できるNumThreads=2ので、各ワーカーは 2 つのタスクを実行します (右?)。問題は、各ワーカーが 2 つのスレッドを実行するように、 4 つのワーカーを持つパープールを作成する必要があるかどうかです。より明示的に:

parpool(4); %set NumThreads = 2 via Parallel computing toolbox %define matrix A1, A2 of size 1000x1000 parfor i=1:2 x(i) = max(abs(eigs(A(i)))); end

x(1)最初の 2 つのコアが で動作し、残りの 2つのコアが で動作するようにしたいと思います。x(2)


最終編集:

コメントに書かれているようにa を使用するparforと、次のようになります。

c = parcluster('local');
A = {rand(2000), rand(2000),rand(2000), rand(2000),rand(2000), 
rand(2000),rand(2000),rand(2000)};
c.NumThreads = 2;
pool = parpool(c, 2); %2 workers
parfor i=1:8
   x(i) = max(abs(eig(A{i})));
end
4

1 に答える 1

2

さまざまなコメントに続いて、クラスター オブジェクトの NumThreadsプロパティを設定すると、起動する各ワーカーはその数の計算スレッドを使用します。これは、Cluster Profile Managerまたはプログラムで実行できます。

を起動するときparpoolに指定する数は、起動するワーカープロセスNumThreadsの数であり、各ワーカーには、クラスター オブジェクトのプロパティに対応するスレッドの数があります。

これをまとめると、次のようになります。

% Use the local cluster
c = parcluster('local');
% Make 2 'A' matrices
A = {rand(2000), rand(2000)};
for numThreads = 1:2
    % Set up cluster NumThreads property for this iteration
    c.NumThreads = numThreads;
    % Build a pool with 2 worker processes
    pool = parpool(c, 2);
    tic
    spmd
        % Each worker operates on a separate element of A
        out = max(abs(eig(A{labindex})));
    end
    t = toc();
    fprintf('Time with NumThreads = %d: %.3f\n', numThreads, t);
    delete(pool);
end

私のマシンでは、関連するタイミングは次のとおりです。

Time with NumThreads = 1: 4.693
Time with NumThreads = 2: 3.636
于 2020-05-12T05:53:11.240 に答える