在CMakeLists里做如下配置:
1 | FIND_PACKAGE( OpenMP REQUIRED) |
注意: OpenMP并不适合需要复杂的线程间同步和互斥的场合,这种情况下花的时间可能更长
gmapping使用OpenMP加速的语句: #pragma omp parallel for
for循环的drawFromMotion之前
1
2
3
4
5//#pragma omp parallel for
for (unsigned int i = 0; i < m_particles.size(); i++) {
m_particles[i].pose = m_motionModel.drawFromMotion(m_particles[i].pose, relPose,m_odoPose);
}invalidateActiveArea之前
1
2
3//#pragma omp parallel for
for (unsigned int i = 0; i < m_particles.size(); i++) {
m_matcher.invalidateActiveArea();scanMatch函数开头,实际就是对整个scanMatch并行化
1
2
3inline void scanMatch(double * plainReading) {
for (unsigned int i = 0; i < m_particles.size(); i++) {updateMap函数中
1 |
|
- 重采样resample函数
对于保留下来的粒子进行更新,在并行化操作里面m_particles.push_back()
会报错,因此需要把push_back()提出来,在外面的的for循环进行
1 |
|
为每个粒子更新地图时,同样可以并行化