5

データの生成とデータの処理という 2 つの関数を作成しました。データ処理は時間がかかるので、並列スレッドで処理したい。しかし、私は彼らにいくつかの問題を抱えています。まず、ここに私のプログラムがあります:

result = zeros(1, 10);

matlabpool open local 2
spmd
    for a = 1:5
        data = generate_data();
        display(sprintf('Received data on CPU%d: %d', labindex, data));
        result(end + 1) = process_data(data);
    end
    display(sprintf('All done on CPU%d', labindex));
end
matlabpool close

そしてそれが返したもののログ:

Starting matlabpool using the 'local' profile ... connected to 2 workers.
Lab 1: 
  Received data on CPU1: 100
Lab 2: 
  Received data on CPU2: 100
Lab 1: 
  Received data on CPU1: 101
  Received data on CPU1: 102
  Received data on CPU1: 103
  Received data on CPU1: 104
  All done on CPU1
Lab 2: 
  Received data on CPU2: 101
  Received data on CPU2: 102
  Received data on CPU2: 103
  Received data on CPU2: 104
  All done on CPU2
Sending a stop signal to all the workers ... stopped.

私が持っている問題があります:

  1. generate_data によって返される値は、両方のスレッドで同じです。私は違うはずです。スレッドは、同じデータを 2 回処理するのではなく、異なるデータを処理する必要があります。一度にデータ セット全体を生成して getLocalPart を使用することができません。

  2. 変数の結果は double の 1x10 マトリックスではなく、composites の 1x2 マトリックスです。(共同) 分散配列について読みましたが、役に立ちませんでした。double の 1x10 行列を受け取るにはどうすればよいですか?

  3. 自分のデータの処理が終わったら、CPU1 が CPU2 のデータを処理するにはどうすればよいですか? 一般的に、これを行う方法がわかりません。

  4. 「Lab 1:」と「Lab 2:」を削除することはできますか? 彼らは私のログを台無しにしています:)

上記を考慮すると、ログ (より大きなデータ セットの場合) は次のようになります。

Starting matlabpool using the 'local' profile ... connected to 2 workers.
Received data on CPU1: 100
Received data on CPU2: 101
Received data on CPU1: 102
Received data on CPU1: 103
Received data on CPU1: 104
Received data on CPU1: 105
Received data on CPU2: 106
Received data on CPU1: 107
Received data on CPU1: 108
Received data on CPU2: 109
All done on CPU1
All done on CPU2
Sending a stop signal to all the workers ... stopped.
4

1 に答える 1

10

もっと単純な を使わないのはなぜparforですか? 現時点では、各ワーカーでループを実行していますが、ループの反復を並行して実行したいと考えていると思います。

nIter = 10;
result = zeros(1, nIter);

matlabpool open local 2

    parfor a = 1:nIter
        data = generate_data();
        fprintf('%s: processing set %i/%i\n',datestr(now),a,nIter)
        result(a) = process_data(data);
    end
end
matlabpool close
于 2013-01-22T14:32:07.563 に答える