我正在編寫一些代碼來並行處理碰撞,預期的結果是每個線程都有一個加速,但是我沒有在數據處理中獲得任何加速,因爲我在裏面有一個關鍵部分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()
只做一個乘法(臨界區),但會變得更加複雜。
double parallel_reduce(){
#pragma omp critical
this->vel_ *= 0.99;
return vel_.length();
}
實際時間:
- 串行,25.635
- 平行,123.559
如果'parallel_reduce()'是你的瓶頸,那麼這就是你的工作。也許張貼它的身體和人們可以幫助。這裏沒有祕密武器! –
關鍵區域的並行循環基本上只是一個串行循環,並且有很多額外的開銷,並且它並不令我感到驚訝。告訴我們更多關於bodyContact.at(i).bodyA()和.bodyB()中的this->他們都是獨立的,還是會有一些As和一些Bs重疊? –
他們會重疊很多。並且parallel_reduce()的實際代碼並不像它應該有什麼區別那麼重要,還有其他方法可以讓代碼變得更慢,以便區別它們嗎? –