CMAKE 编译CUDA的设置,关于CMAKE语法请自行参考官方文档。这里给出CMakeLists.txt的设置。
(1)指定CMAKE最小版本
cmake_minimum_required(VERSION 3.24 FATAL_ERROR)
(2)指定使用的显卡架构,natie为本地显卡,也可指定其他架构
if (NOT DEFINED CMAKE_CUDA_ARCHITECTURES)
set(CMAKE_CUDA_ARCHITECTURES native)
endif()
(3)指定项目名称,且设置编写语言为C++和CUDA(这里的CUDA会启用nvcc编译器)
project(cuda_lib LANGUAGES CXX CUDA)
(4)指定编译模式方式 ,一般选release速度更快
if (DEFINED CMAKE_BUILD_TYPE)
string(TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE)
else()
set(CMAKE_BUILD_TYPE RELEASE)
endif()
(5)指定C++版本,并强制使用,不允许降级
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
(6)使用CheckLanguage语言检查脚本查看CUDA语言是否可用
include(CheckLanguage)
check_language(CUDA)
(7)利用FindCUDAToolkit脚本,查看是否安装CUDAToolkit
if(NOT CUDAToolkit_FOUND)
include(FindCUDAToolkit)
endif()
(8)包含CUDAToolkit的路径
include_directories(${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES})
(9)指定CUDA 版本,并强制使用
set(CMAKE_CUDA_STANDARD 14)
set(CMAKE_CUDA_STANDARD_REQUIRED ON)
(10)使用STREQUAL判断
代码编译模式,并指定编译参数
if(${CMAKE_BUILD_TYPE} STREQUAL "RELEASE")
set(NVCC_FLAGS -O3 -Wno-deprecated-gpu-targets)
message(STATUS "${PROJECT_NAME} compile cuda code in release mode")
else()
set(NVCC_FLAGS -G -Wno-deprecated-gpu-targets)
message(STATUS "${PROJECT_NAME} compile cuda code in debug mode")
endif()
(11)遍历符合文件后缀名的文件,文件路径存到source_file
file(GLOB_RECURSE source_file LIST_DIRECTORIES false src/*.cpp src/*.c src/*.cuh src/*.h src/*.cu)
(12)添加名为${PROJECT_NAME}的静态库,静态库元文件为上面遍历的文件
add_library(${PROJECT_NAME} STATIC ${source_file})
(13)设置${PROJECT_NAME} 静态库属性:CUDA_SEPARABLE_COMPILATION为ON表示所有CUDA文件单独编译;CUDA_RESOLVE_DEVICE_SYMBOLS为ON时表示编译器根据需要在可启用设备链接。
set_target_properties(${PROJECT_NAME} PROPERTIES CUDA_SEPARABLE_COMPILATION ON CUDA_RESOLVE_DEVICE_SYMBOLS ON)
(14)为静态库增加编译选项,参考cmake-generator-expressions(7) — CMake 3.23.1 Documentation
target_compile_options(${PROJECT_NAME} PRIVATE $<$
${NVCC_FLAGS}>)
(15)指定CUDA运行时连接库
target_link_libraries(${PROJECT_NAME} PUBLIC CUDA::cudart)
(16)指定安装路径
install(TARGETS ${PROJECT_NAME})