ROS系统学习10---利用OpenMP库进行CPU的多线程加速

在ROS系统的构建中,很多问题是串行的,只能用一个节点进行串行计算。
这样导致的问题是CPU资源并没有完全用到,往往是程序延时很严重,然而CPU却只用了一个线程。
为了解决这个问题,可以用OpenMP库来进行并行处理。示例代码如下:
#include 
#include //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

你可能感兴趣的:(ROS学习,ROS操作系统学习)