CUDA
参考Building Cross-Platform CUDA Applications with CMake
cmake_minimum_required(VERSION 3.8 FATAL_ERROR)
project(cmake_and_cuda LANGUAGES CXX CUDA)
add_library(particles STATIC
randomize.cpp
randomize.h
particle.cu
particle.h
v3.cu
v3.h
)
# 下面选项制定particles库使用C11特性编译,这样所有使用particles库的其他可执行文件都因而使用C11编译
target_compile_features(particles PUBLIC cxx_std_11)
#下面选项指定particles库编译的时候,所依赖的所有CUDA文件之间有关联,默认必须添加。
set_target_properties( particles
PROPERTIES CUDA_SEPARABLE_COMPILATION ON)
add_executable(particle_test_exe test.cu) #怀疑这里换成test.cpp也行
set_property(TARGET particle_test_exe
PROPERTY CUDA_SEPARABLE_COMPILATION ON)
target_link_libraries(particle_text_exe PRIVATE particles)
严重警告,CUDA_SEPARABLE_COMPILATION这个选项,cuda是默认不开的,但是100%的程序都要开,因为我们写的很多cuda代码之间是有关联的,如果不开,那这些cuda代码之间,常用的全局显存空间,或者定义的公有变量,或者调用其他文件的成员函数就完全找不到,会报错的,必须开!!!这就是nvcc中的rdc选项
严重警告,CUDA_NVCC_FLAGS这个选项,一般还是要加上
-std=c++11
,不然就算add_compile_options(-std=c++11)开启了,仍然没用。这是因为后者针对所有cpp文件生效,但是不对cu文件生效,前者只对cu文件生效
CUDA分离编译
上面其实展示了一种分离编译的方案,那就是:
- 先编译cuda库本身
- 使用add_library()命令编译,或者使用cuda_add_library()命令编译
- 对编译好的程序添加分离编译允许选项CUDA_SEPARABLE_COMPILATION
- 此条禁止:禁止将编译好的cuda库使用target_link_library()提前进行链接!!!
- 然后将cuda库以外接库的形式链接到普通c++代码中。
- 先使用普通add_executable()编译其他普通代码
- 使用target_link_libraries()命令链接 编译好的cuda库和${CUDA_LIBRARIES}