ROS内使用Cuda加速的配置

介绍ROS中使用Cuda加速的包配置。

1.ROS

ROS(机器人操作系统)是一个机器人软件平台,能够进行灵活的编程,为异构平台集群提供良好的通信控制机制。并且拥有极好的软件模拟能力,不需要硬件,也能够进行机器人算法的学习。

2.Cuda

Cuda是Nvidia开发的并行运算平台,使用其强大的并行运算能力,我们能够将逻辑控制交付给CPU,将并行计算交给GPU去运算,这就是所谓的”硬件加速”。笔者在使用ROS进行硬件加速的时候,如何添加Cuda的的编程支持,在这里尽心记录。

3.环境配置

3.1环境说明

我们知道,如果需要使用Cuda C语言进行编码的话,就必须使用NVCC编译器进行编译,但是通常情况下,ROS都是通过GCC进行编译的,所以这里的设想是将硬件加速的函数以动态库的方式进行提供,其他包需要使用这个包里的硬件加速函数,就动态调用这个动态库,这样可以最大程度的减少修改原有的包的CMakelists.txt文件。

3.2过程说明

  • catkin_create_pkg cuda_lib roscpp rospy std_msgs创建一个新的包。
  • 修改新建的包的CMakelists.txt文件如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
cmake_minimum_required(VERSION 2.8.3)
PROJECT (cuda_lib)
FIND_PACKAGE(CUDA REQUIRED)
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
)
# 在NVCC_FLAGS变量中添加你的头文件的路径,比如这里就用到了cuda_samples提供的帮助函数
SET(CUDA_NVCC_FLAGS "-arch=sm_60" "-I/usr/local/cuda-8.0/samples/common/inc" "-I/home/nvidia/ros_bo/src/cuda_lib/include" CACHE STRING "nvcc flags" FORCE)
SET (CUDA_VERBOSE_BUILD ON CACHE BOOL "nvcc verbose" FORCE)
SET(LIB_TYPE STATIC)
#添加一个库 libcuda_lib,在其他包中需要使用时,添加链接即可(target_link)
CUDA_ADD_LIBRARY(cuda_lib ${LIB_TYPE} src/cuda_lib.cu)
catkin_package(
INCLUDE_DIRS include
)
include_directories(include
${catkin_INCLUDE_DIRS}
)
ADD_EXECUTABLE(cuda_lib_node src/main.cpp)
ADD_DEPENDENCIES(cuda_lib_node cuda_lib)
TARGET_LINK_LIBRARIES(cuda_lib_node
${catkin_LIBRARIES}
${PCL_LIBRARIES}
cuda_lib
)
  • 编写cu文件如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <cuda.h>
#include <cuda_runtime.h>
//实现核函数
__global__
void hello_g(int *a, int *b)
{
a[threadIdx.x] += b[threadIdx.x];
}
//实现C函数,之后在别出调用时,直接调用该函数,就不必使用NVCC进行编译了
int hello_c()
{
int a =4;
int b= 4;
kernel<<1,1>>>(&a, &b);
}
Dock wechat
欢迎您扫一扫上面的微信公众号,订阅我的公众号