ROS中调用CUDA

来源:互联网 发布:数据结构和算法分析pdf 编辑:程序博客网 时间:2024/05/22 16:42

网上有说.cpp调用cuda函数的,实际上ROS中是一样的,都是利用cmake进行编译。

举个例子,ROS中创建一个cpp文件,功能是调用GPU函数做单线程加法运算并且打印hello。

hello.cpp

  1 #include <iostream>  2 #include <cstdio>  3 using namespace std;  4 extern "C" int func();  5 int main(void)  6 {  7     func();  8     printf("hello\n");  9     return 0; 10 }

add.cu

#include <stdio.h>#include <stdlib.h>#include <cuda_runtime.h>#define DATA_SIZE 1048576int data[DATA_SIZE];void GenerateNumbers(int* number,int size){    srand(time(0));    for(int i = 0;i < size;i++)    {        number[i] = rand()%10;    }}__global__ static void sumOfSquares(int *num,int* result,clock_t* time,float* costtime){    int sum = 0;    int i;    clock_t start = clock();    for(i = 0;i < DATA_SIZE;i++)    {        sum += num[i]*num[i];    }    *result = sum;    *time = clock() - start;    *costtime = (float)(*time)/CLOCKS_PER_SEC;}extern "C" int func(){     int* gpudata,*result;     clock_t* time;     float* costtime;     GenerateNumbers(data,DATA_SIZE);     cudaMalloc((void**)&gpudata,sizeof(int)*DATA_SIZE);     cudaMalloc((void**)&result,sizeof(int));     cudaMalloc((void**)&time,sizeof(clock_t));     cudaMalloc((void**)&costtime,sizeof(float));     cudaMemcpy(gpudata,data,sizeof(int)*DATA_SIZE,cudaMemcpyHostToDevice);     sumOfSquares<<<1,1,0>>>(gpudata,result,time,costtime);     float time_used;     clock_t time_f;     int sum;     cudaMemcpy(&sum,result,sizeof(int),cudaMemcpyDeviceToHost);     cudaMemcpy(&time_used,costtime,sizeof(float),cudaMemcpyDeviceToHost);     cudaMemcpy(&time_f,time,sizeof(clock_t),cudaMemcpyDeviceToHost);     time_used = time_used/900;     printf("sum:[%d] time_used:[%lfs] time_f:[%ld]\n",sum,time_used,time_f);     return 0;}

CMakeLists.txt

  1 CMAKE_MINIMUM_REQUIRED(VERSION 2.8)  2 PROJECT(test_cuda)  3 INCLUDE(/home/super/opencv-3.2.0/cmake/FindCUDA.cmake)  4 CUDA_ADD_EXECUTABLE(test_cuda  5 add.cu hello.cpp)

解释一下,在.cpp中调用cuda函数时,需要这样声明extern “C” int func();

而在add.cu中同样需要这样定义
extern “C” int func()
{

}

CMakeLists.txt 需要添加FindCUDA.cmake支持,这个在linux下直接find . -name FindCUDA.cmake,查看安装的cmake是否支持CUDA。

原创粉丝点击