複数のプロセッサで実行したい恥ずかしいほど並列の問題があります。新しいプロセッサに新しいスレッドを自動的に送信すると思っていました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
を使用しますが、スレッドをスケジュールするよりもスレッドの作業が少ない場合、マルチスレッドの利点は見られません。
これについて私の理解を助けてくれた皆さんに感謝します。