衝突の並列処理用のコードをいくつか書いています。予想される結果は、各スレッドの高速化ですが、内部にクリティカル セクションがparallel_reduce()
あり、シリアル化が多すぎると思われるため、データ処理が高速化されていません。オブジェクトへのアクセス。コードは次のようになります。
do {
totalVel = 0.;
#pragma omp parallel for
for (unsigned long i = 0; i < bodyContact.size(); i++) {
totalVel += bodyContact.at(i).bodyA()->parallel_reduce();
totalVel += bodyContact.at(i).bodyB()->parallel_reduce();
}
} while (totalVel >= 0.00001);
並列にするか、アクセスのシリアル化が多すぎることで速度を上げる方法はありますか?
所見:
- bodyA()とbodyB()は、bodyContact コンテナー内で何度も繰り返されるオブジェクトです。
- 今のところ
parallel_reduce()
、1 つの乗算 (クリティカル セクション) のみを実行しますが、より複雑になります。
double parallel_reduce(){
#pragma omp critical
this->vel_ *= 0.99;
return vel_.length();
}
実際のタイミング:
- シリアル、25.635
- 平行、123.559