0

並列プログラミングでスレーブからマスターに返される値を収集する適切な方法を見つけようとしています。マンデルブロのピクセルを計算するために作業を分割する方法について、以前に同様の質問をしました。作品の送り方は分かったのですが、どうやってデータを集めてピクセルとしてプロットするのか、まだ悩んでいます。

ノード 0: (マスター)

ノード 1:(スレーブ)

v[0]  = {2,3,4,5,67,86,56,5} // core 0 holds value of 8 threads of this core
v[1]  = {12,21,4,3,54,65,6,5,4} // core 1 holds value of 9 threads of this core
v[2]  = {1,3,4,54,6,5,65,7,4}  //core 2 holds value of 9 threads of this core

ノード 2:(スレーブ)

v[0]  = {2,3,4,5,67,86,56,5} // core 0
v[1]  = {12,21,4,3,54,65,6,5,4} // core 1 
v[2]  = {1,3,4,54,6,5,65,7,4}  //core 2

ノード 3:(スレーブ)

v[0]  = {2,3,4,5,67,86,56,5} // core 0
v[1]  = {12,21,4,3,54,65,6,5,4} // core 1 
v[2]  = {1,3,4,54,6,5,65,7,4}  //core 2

したがって、マスターがこれらの値を必要とする場合、スレーブはベクトルを追加して送信する必要がありますか、それとも値をマスターに渡すための他のより良い方法はありますか?

4

1 に答える 1

1

C++11 スレッド ライブラリ (または Boost.Thread) を使用している場合、おそらく必要なのはstd::future. これらは、次の 3 つの方法のいずれかで取得できます。

  1. a をスレッドに渡しstd::promiseて値を設定させる。
  2. を使用してstd::packaged_task
  3. 呼び出すことによってstd::async

を使用した例を次に示しstd::asyncます。

some_return_type my_work_function( some_input_type const & );

some_input_type inputs_to_slave_threads[] = { /* ... */ };

std::future< some_return_type >
  // launch the slaves, letting the OS decide whether to spawn new threads
  slave_0_future = std::async( my_work_function, std::ref( inputs_to_slave_threads[0] ) ),
  slave_1_future = std::async( my_work_function, std::ref( inputs_to_slave_threads[1] ) ),
  // ...
  slave_N_future = std::async( my_work_function, std::ref( inputs_to_slave_threads[N] ) );

some_return_type
  // block until results are ready
  result_of_slave_0 = slave_0_future.get(),
  result_of_slave_1 = slave_1_future.get(),
  // ...
  result_of_slave_N = slave_N_future.get();

process_results_of_slaves( result_of_slave_0, ..., result_of_slave_N );
于 2013-04-18T12:24:33.667 に答える