在ROS系统的构建中,很多问题是串行的,只能用一个节点进行串行计算。 这样导致的问题是CPU资源并没有完全用到,往往是程序延时很严重,然而CPU却只用了一个线程。 为了解决这个问题,可以用OpenMP库来进行并行处理。示例代码如下:
#include <ros/ros.h>
#include <omp.h>//openMP库
int main(int argc, char **argv)
{
ros::init(argc,argv,"rosopenmp");
ros::NodeHandle n;
double begin = omp_get_wtime();
int a[1000000];
#pragma omp parallel for
for (size_t i = 0; i < 1000000; i++)
{
a[i] = 2 * i;
a[i] = 2 * i;
a[i] = 2 * i;
a[i] = 2 * i;
a[i] = 2 * i;
a[i] = 2 * i;
a[i] = 2 * i;
a[i] = 2 * i;
a[i] = 2 * i;
}
double end = omp_get_wtime();
ROS_INFO("spend time: %f",(end-begin));//花费时间计算
ros::spinOnce();
}
编译的话需要在CMakeLists.txt中添加如下指令:
find_package(OpenMP)
if (OPENMP_FOUND)
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}")
endif()
这里需要注意计时程序要用omp_get_wtime(),它将返回程序段的运行时间。而如果用的是clock()函数,它返回的是处理器执行的时间,只要内核有指令在CPU中运行,时间就会增加,这样相当于计算所有线程执行时间的总和,看起来反倒会觉得更慢。 参考文章:https://blog.csdn.net/Fourier_Legend/article/details/82146906#example-1-%E5%88%9D%E8%AF%86-openmp-hello-world