• 欢迎访问开心洋葱网站,在线教程,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站,欢迎加入开心洋葱 QQ群
  • 为方便开心洋葱网用户,开心洋葱官网已经开启复制功能!
  • 欢迎访问开心洋葱网站,手机也能访问哦~欢迎加入开心洋葱多维思维学习平台 QQ群
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏开心洋葱吧~~~~~~~~~~~~~!
  • 由于近期流量激增,小站的ECS没能经的起亲们的访问,本站依然没有盈利,如果各位看如果觉着文字不错,还请看官给小站打个赏~~~~~~~~~~~~~!

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

人工智能 _寒潭雁影 1298次浏览 0个评论

在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


开心洋葱 , 版权所有丨如未注明 , 均为原创丨未经授权请勿修改 , 转载请注明ROS系统学习10—利用OpenMP库进行CPU的多线程加速
喜欢 (0)

您必须 登录 才能发表评论!

加载中……