CUDA库的cmake写法

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分离编译

上面其实展示了一种分离编译的方案,那就是:

  1. 先编译cuda库本身
    1. 使用add_library()命令编译,或者使用cuda_add_library()命令编译
    2. 对编译好的程序添加分离编译允许选项CUDA_SEPARABLE_COMPILATION
    3. 此条禁止:禁止将编译好的cuda库使用target_link_library()提前进行链接!!!
  2. 然后将cuda库以外接库的形式链接到普通c++代码中。
    1. 先使用普通add_executable()编译其他普通代码
    2. 使用target_link_libraries()命令链接 编译好的cuda库和${CUDA_LIBRARIES}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章