我正在编写一些用于并行处理冲突的代码,预期的结果是每个线程都有一个加速,但是我没有在数据处理上得到任何加速,因为我里面有一个关键部分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);
有没有办法通过使其并行或访问的序列化太多来获得更快的速度?
观察:
- 身体A()和身体B()是在 bodyContact 容器内重复很多次的对象。
- 目前
parallel_reduce()
只做一次乘法(临界区),但会变得更复杂。
double parallel_reduce(){
#pragma omp critical
this->vel_ *= 0.99;
return vel_.length();
}
实际时间:
- 序列号,25.635
- 平行,123.559