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

116
0
2021年1月29日 09时16分

在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

发表评论

后才能评论