How to add .cu to ROS package? How to call function in .cu?
Could you please help me with the .cpp and .cu in ROS? I wish to call the function in .cu file. I use some functions in https://answers.ros.org/question/162646/how-to-catkin_make-cuda-code/
However there must be something wrong with the CUDA it seems couldn't link the cuda. The code is :
CMakeLists
cmake_minimum_required(VERSION 2.8.3)
project(pointcloud_from_camera)
add_compile_options(-std=c++11)
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
sensor_msgs
cv_bridge
image_transport
pcl_conversions
pcl_ros
)
find_package(CUDA REQUIRED)
include_directories(${CUDA_INCLUDE_DIRS})
link_directories(${CUDA_LIBRARY_DIRS})
set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} -DMY_DEF=1")
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DMY_DEF=1" )
set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DMY_DEF=1" )
# only necessary if you wish to create a lib
set(CUDA_ATTACH_VS_BUILD_RULE_TO_CUDA_FILE OFF)
set(BUILD_SHARED_LIBS ON)
# cuda compile GPU_CODE for executable
cuda_compile( TRANSFORM_O src/transform.cu )
cuda_add_library( ${TRANS} src/lib_transform.cu )
catkin_package(
CATKIN_DEPENDS
roscpp
)
include_directories(
include
${catkin_INCLUDE_DIRS}
${PCL_INCLUDE_DIRS}
)
add_executable (sensordata src/sensordata.cpp)
target_include_directories(sensordata
PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}
PUBLIC ${CUDA_INCLUDE_DIRS}
)
target_link_libraries(sensordata
LINK_PUBLIC ${catkin_LIBRARIES}
LINK_PUBLIC ${CUDA_LIBRARIES}
${CUDA_CUDA_LIBRARY} ${CUDA_CUDART_LIBRARY} ${CUDA_NPP_LIBRARIES_ZED}
${TRANS}
)
The .cu https://stackoverflow.com/questions/14054153/how-can-multiply-vector-by-a-matrix-using-cuda-c
#include <cuda.h>
#include <cuda_runtime.h>
#include <stdio.h>
#include <time.h>
#include <curand_kernel.h>
__global__ void kernel(float *vec, float *mat, float *out, const int N, const int M){
int tid=threadIdx.x+blockIdx.x*blockDim.x;
float sum=0;
if(tid<M){
for(int i=0; i<N; i++)
sum += vec[i]*mat[(i*M)+tid];
out[tid]=sum;
}
}
extern "C" int testmain (void) {
srand( time(NULL) );
float *a, *b, *c;
float *dev_a, *dev_b, *dev_c
........
cudaMemcpy(dev_a, a, sizeof(float)*N, cudaMemcpyHostToDevice);
cudaMemcpy(dev_b, b, sizeof(float)*N*M, cudaMemcpyHostToDevice);
kernel<<<M/256+1, 256>>>(dev_a, dev_b, dev_c, N, M);
cudaMemcpy(c, dev_c, sizeof(float)*M, cudaMemcpyDeviceToHost);
};
The .cpp
#include "transform.cu"
#include <cuda.h>
extern "C" int testmain();
void callbackfunction(){
testmain();
}
int main (int argc, char** argv)
ros::init (argc, argv, "get_pointcloud_into_gpuvoxel");
ros::NodeHandle nh;
}
It seems the function in .cpp is wrong.
The error is:
[ 20%] Linking CXX shared library /home/Downloads/map/devel/lib/libsrc/lib_transform.cu.so
/usr/bin/ld: cannot open output file /home/sDownloads/map/devel/lib/libsrc/lib_transform.cu.so: No such file or directory
collect2: error: ld returned 1 exit status
pointcloud_from_camera/CMakeFiles/src/lib_transform.cu.dir/build.make:70: recipe for target '/home/shupeng/Downloads/lyx/probability_map/devel/lib/libsrc/lib_transform.cu.so' failed
make[2]: *** [/home/shupeng/Downloads/lyx/probability_map/devel/lib/libsrc/lib_transform.cu.so] Error 1
CMakeFiles/Makefile2:3043: recipe for target 'pointcloud_from_camera/CMakeFiles/src/lib_transform.cu.dir/all' failed
make[1]: *** [pointcloud_from_camera/CMakeFiles/src/lib_transform.cu.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....