如何让CUDA编译普通C++文件,细说-x cu选项如何在CMakeLists.txt里面实现

  最近,在搞CUDA编程,需要在一个.cpp文件里面包含各种类库,然后还需要引用GPU的相关库函数,包括核函数,怎么能实现呢?

我的编译环境:ubuntu16.04, cmake 3.5.1

比如有如下的main.cpp c++文件:

// This is a test for CUDA compile option -x cu

//code by guan shiyuan

#include
#include
__global__ void foo()
{
printf("CUDA!!!\n");

}
void useCUDA()
{

foo<<<1,5>>>();
cudaDeviceSynchronize();

}
int main() {

useCUDA();
return 0;

}

方法1:直接用命令行编译:‘nvcc main.cpp main -x=cu',就是这个-x cu选项管编译.cpp文件

方法2:采用cmake,但是如何编写这个CMakeLists.txt是最为关键的,我百度了一下,国内没有人做,国外网站也没有,问了英文达的相关人员才知道如何设置,其实就是设置CUDA_SOURCE_PROPERTY_FORMAT属性,但是这个属性不是那么好设置的,我认真看了一下cmake文档才知道。对于上面的文件需要在CMakeLists.txt如下设置:set_source_files_properties(main.cpp PROPERTIES CUDA_SOURCE_PROPERTY_FORMAT OBJ),对于上面完整的CMakeLists.txt如下:

# CMakeLists.txt for test -x cu option project by guan shiyuan
project(test_cuda_project)
# required cmake version
cmake_minimum_required(VERSION 2.8)
# packages
find_package(CUDA)
set(CUDA_SOURCE_PROPERTY_FORMAT OBJ)

set(CUDA_SEPARABLE_COMPILATION ON)
include_directories(${CUDA_INCLUDE_DIRS})
set(CUDA_PROPAGATE_HOST_FLAGS OFF)
set(CUDA_NVCC_FLAGS -arch=sm_61;-O3;-G;-g;-std=c++11)

file(GLOB_RECURSE CURRENT_HEADERS  *.h *.hpp *.cuh)
file(GLOB CURRENT_SOURCES  *.cpp *.cu)
set_source_files_properties(main.cpp PROPERTIES CUDA_SOURCE_PROPERTY_FORMAT OBJ)
source_group("Include" FILES ${CURRENT_HEADERS})
source_group("Source" FILES ${CURRENT_SOURCES})

cuda_add_executable(test_cuda_project ${CURRENT_HEADERS} ${CURRENT_SOURCES} )

我这个CMakeLists.txt是万能的模板,可以拿去编译任何*.cpp  *.cu,其实编译CUDA编译器可以编译普通的才C++的程序,这个C++程序可以包含任何普通的库,比如OpenCV等,网上有人用extern "c" void (){}函数包裹一个含有核函数的CUDA程序也是可以的,但是麻烦,上面提到的直接在C++文件里面写核函数,可以把核函数做到类里面的,具体大家可以看看BundleFusion里面的CUDA编程,目前发现这个slam是CUDA编程最好的,也是最高级的,其实用一个CUDA编译器可以直接编译*.cpp *.cu *.hpp等等文件。对于组织slam工程很有帮助,对于大型C++和CUDA混合的工程此种方法非常好!

我目前在用CUDA编写稠密slam用于三维重构,如果大家有兴趣可以互相交流,留个qq:31781410

你可能感兴趣的:(如何让CUDA编译普通C++文件,细说-x cu选项如何在CMakeLists.txt里面实现)