私の質問は、シミュレーションを実際にはパフォーマンスを低下させないように、マルチスレッドを以下のように正しく設計する方法です。効率的な方法でシミュレーションのループ内でマルチスレッドが可能ですか?
class MyClass
{
private:
int *data1 = new int[ARRAY_SIZE]();
int *data2 = new int[ARRAY_SIZE]();
public:
void fillData(); //any function that fills the inner data
void processData(const int iteration);
}
シミュレーションの各反復、4:
は、あなたが(500メガバイトごとの周りに)大きな配列のカップルを保持MyClass
というクラス、およびそのようなアレイを用いて情報を処理する機能を持っていると仮定しますMyClass
のインスタンスが処理されます。私の理想的な世界では、このようなインスタンスのそれぞれを1つのスレッドに渡し、次に各スレッドの内部に渡すことです。instance.processData()
を呼び出してください。 #include <thread>
を使用すると、それは次のようになります。
int main()
{
MyClass inst1,inst2, inst3, inst4;
//<----- here you would have code that fills the arrays inside each instance of MyClass
for(int iteration=0; iteration<MAX_ITERATIONS; iteration++)
{
std::thread t1(&MyClass::processData, &inst1, iteration);
std::thread t2(&MyClass::processData, &inst2, iteration);
std::thread t3(&MyClass::processData, &inst3, iteration);
std::thread t4(&MyClass::processData, &inst4, iteration);
t1.join();
t2.join();
t3.join();
t4.join();
}
return 0;
}
私は反復ごとのスレッドにMyClass
インスタンスを派遣していた理由は、各インスタンスのprocessData
終了した後、私はそれぞれのデータの結果との間に比較を行うことです繰り返しごとにインスタンス。
問題は、記述されているコードが実際には非マルチヒットバージョンよりも非常に遅いことです。それで問題は次のようになります。私は何が間違っているのですか?それを改善する方法はありますか?各繰り返しの最後に各インスタンスの処理の結果を比較しなければならないと考えていますか?
PS1:私は絶対にprocessData
に含まれるプロセスをパラレル化できません。これは100%の問題です。
PS2:実際のコードに関連するものはそれ自体では公開できませんが、私が上で書いたスニペットを参考にして実際のコンパイル可能な例にすることができれば助かります。私はそれがなければ十分に明確な点があるかもしれないと思うが。
ループ内のスレッドのオーバーヘッドを行うことは非常に非効率的である。 – franji1
「PS2」に関して、はい、[mcve]を提供してください。特に、このようなコードを一切持たずに、「反復ごとに各インスタンスのデータ結果間の*比較」に関するあなたの発言を解決することは困難です。これはパフォーマンスに関するものなので、MCVEの改善が実際のコードに変換されるような例でも、同様のパフォーマンス特性が必要です。 – Zulan