データの生成とデータの処理という 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.
私が持っている問題があります:
generate_data によって返される値は、両方のスレッドで同じです。私は違うはずです。スレッドは、同じデータを 2 回処理するのではなく、異なるデータを処理する必要があります。一度にデータ セット全体を生成して getLocalPart を使用することができません。
変数の結果は double の 1x10 マトリックスではなく、composites の 1x2 マトリックスです。(共同) 分散配列について読みましたが、役に立ちませんでした。double の 1x10 行列を受け取るにはどうすればよいですか?
自分のデータの処理が終わったら、CPU1 が CPU2 のデータを処理するにはどうすればよいですか? 一般的に、これを行う方法がわかりません。
「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.