4

複数のプロセッサで実行したい恥ずかしいほど並列の問題があります。新しいプロセッサに新しいスレッドを自動的に送信すると思っていましたboost::threadが、それらはすべて親プロセスと同じコアで実行されています。各スレッドを異なるプロセッサで実行することは可能ですか? それとも MPI のようなものが必要ですか?

私の疑いでは、それboost::threadは単にマルチプロセッサ ツールではなく、設計されていないことを実行するように求めているということです。

編集:私の質問はこれに要約されます:すべてのスレッドが1つのプロセッサで実行されるのはなぜですか? boost::threadスレッドを異なるプロセッサに送信する方法はありますか?

私のコードの関連サンプルは次のとおりです。

size_t lim=1000;
std::deque<int> vals(lim);
std::deque<boost::thread *> threads;
int i=0; 
std::deque<int>::iterator it = vals.begin();
for (; it!=sigma.end(); it++, i++) {
  threads.push_back(new boost::thread(doWork, it, i));
  while (threads.size() >= maxConcurrentThreads) {
    threads.front()->join();
    delete threads.front();
    threads.pop_front();
  }
}
while(threads.size()) {
  threads.front()->join();
  threads.pop_front();
}

明らかなようにdoWork、パラメータiを使用して何らかの計算を行い、結果を に保存しvalsます。私の考えではmaxConncurrentThreads、使用可能なコアの数と同じに設定すると、各スレッドはアイドル状態のコアを使用することになりました。boost::threadこのように機能させることができないことを確認する人が必要です。

(キューを使用するよりも同時スレッドの数を制限するためのより良い方法があると思います。それについてもお気軽に叱ってください。)


doWork関数は次のとおりです。

void doWork(std::deque<int>::iterator it, int i) {
  int ret=0;
  int size = 1000; // originally 1000, later changed to 10,000,000
  for (int j=i; j<i+size; j++) {
    ret+=j;
  }
  *it=ret;
  return;
}

編集:Martin James が示唆したように、問題は doWork 関数が最初は 1000 個の int 追加しかないことでした。このような小さなジョブでは、スレッドの実行よりもスレッドのスケジューリングに時間がかかるため、使用されていたプロセッサは 1 つだけでした。ジョブを長くする (10,000,000 int を追加する) と、望ましい動作が得られました。ポイントは次のとおりです。デフォルトで複数のコアboost::thread 使用しますが、スレッドをスケジュールするよりもスレッドの作業が少ない場合、マルチスレッドの利点は見られません。

これについて私の理解を助けてくれた皆さんに感謝します。

4

1 に答える 1

5

常にキューの最初のスレッドに参加しています。このスレッドの処理に時間がかかっている場合は、残っているスレッドがこのスレッドだけである可能性があります。あなたが望むのは、スレッドが完了したら新しいスレッドを開始することだと思います。

ただし、有効な同時実行レベルが 1 つしか得られない理由はわかりません。

doWork 関数を見た後、そもそもスレッドを開始するよりも少ない作業で済むように、ほとんど作業を行っていないと思います。より多くの作業 (1000x) で実行してみてください。

于 2012-04-25T16:13:25.300 に答える