重い計算を行う必要がある状況があります。データを細分化してからマージするのが最も速いことがわかりました (サイズが大きくなるにつれて、時間も速くなるため、分割は論理的です)。
アプリケーションにデータサイズを与えることができるはずです。たとえば、100 万個の double 値としましょう。
私が今持っているのは、このサイズに基づいて作成されたデータを関数に送信し、計算後にそれを返し、リターンをループしてこのデータをメインベクトルにアンロードすることです。
200 個のパーツを送りたいのですが、「最後の」パーツは 1 つです。たとえば、size = 1000005 を指定すると、この関数が最初に 5000 回実行され、次にサイズ 5 のデータを持つ最後の関数が実行されます。
int size = 1000000;
int times = size / 200; // 5000
int leftover = size % 200; // 0, this not performed
QVector<double> x(size);
QVector<double> y(size);
x = createData(size);
x = createData(size);
for (int i = 0; i < times; i++)
{
holder = createData(200);
QVector<double> tempx = x.mid(i*200, 200);
QVector<double> tempy = y.mid(i*200, 200);
holder = myfunction(tempx, tempy, 200); // let it now just return `tempy`
for (int j = 0; j < 200; j++)
{
y[i*200 + j] = holder[j];
}
}
// leftover function here, really similar to this part before.
// plotting function here
最後に、x
初期化されy
たままになり、計算が行われます。
これらのコード部分は別々に実行でき、速度が重要であるため、複数のコアを使用したいと考えています。
以下は、状況をさらに特徴付けます。
- これらの関数呼び出しは互いに独立しており、最終的にベクトルが完成したときにのみ、結果をプロットしたいと思います。
- 各通話の完了時間は大きく異なります。
- の量は
times
可変でなければなりません。
あまりにも多くのスレッドを使用するとプロセスが遅くなる可能性があるため、最大スレッド数は (少なくとも出発点として) コアの量にすることをお勧めします。状況を考えると、キューイングシステム/スレッドプールは、1 つのスレッドがいくつかの簡単なジョブを実行し、他のスレッドがより難しいジョブによってすべてを遅くしている間、時間を無駄にしないようにするのが理にかなっているように思われます。
数十のチュートリアルでいくつかの (通常は 2 つの) スレッドを使用していくつかのメッセージを出力するのは簡単に思えますが、ベクトルを返し、これらのスレッドをメイン関数に安全にアンロードする方法、およびスレッドプールを作成する方法について、より詳細なヘルプを提供してください。無駄にならない?
Ubuntu 13.04、Qt、および C++11x を使用していますが、問題にはなりません。