如何讓CUDA編譯普通C++檔案,細說-x cu選項如何在CMakeLists.txt裡面實現
最近,在搞CUDA程式設計,需要在一個.cpp檔案裡面包含各種類庫,然後還需要引用GPU的相關庫函式,包括核函式,怎麼能實現呢?
比如有如下的main.cpp c++檔案:
#include <iostream> #include <stdio.h> __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 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工程很有幫助,對於大型CUDA此種方法非常好!