私はこれを正しく測定していないかもしれませんが、私が遊んでいるいくつかの簡単なコードがあります。スレッドプールではないと思います。ワークユニットを非常に大きくすると、CPUは190〜199%になります(デュアルコアを使用しています)が、低くすると、ワークユニットは小さくなりますが、CPUよりもはるかに多くなります。プログラムを140〜160%で実行します。
私が考えているのは、スレッドはプールされていませんが、必要に応じて破棄/作成されているため、ワークロードが小さい場合はプログラムの速度が低下します。スレッドの数を制御するために使用tbb::task_scheduler_init
していますが、スレッドを存続させるようにtbbに指示する方法がわかりません。
問題を説明するためのコードを次に示します。
#include <iostream>
#include <list>
#include <tbb/task.h>
#include <tbb/task_group.h>
//#include <stdlib.h>
#include "tbb/task_scheduler_init.h"
#include <boost/thread.hpp>
using namespace tbb;
long fib(long a)
{
if (a < 2) return 1;
return fib(a - 1) + fib(a - 2);
}
class PrintTask
{
public:
void operator()()
{
//std::cout << "hi world!: " << boost::this_thread::get_id() << std::endl;
fib(10);
}
};
int main()
{
tbb::task_scheduler_init init(4); //creates 4 threads
task_group group;
for (int i = 0; i < 2000000; ++i)
{
group.run(PrintTask());
//std::cout << i << std::endl;
}
std::cout << "done" << std::endl;
group.wait();
return(0);
}
fibを40-45に変更すると、各スレッドの作業が大きくなり、フルスピードになりますが、現在の設定を使用すると、ジョブは非常に小さくなりますが、多くのことを実行します。
注:おそらく関連していることに気付いたのは、上記の場合、メモリを完全に使用していることです(4ギガ無料)。減速はそれに関連しているのでしょうか?また、なぜこのプログラムはすべてのメモリを使用するのでしょうか?スレッドを呼び出しているだけの場合、それをメモリに保存するのは何ですか?実行する回数を示すキューがありませんか、それとも実行するためにスレッド全体をメモリに保存していますか?
チュートリアルを読みましたが、それでもその動作に混乱しています(意図した結果は得られますが)。