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}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章