cuファイルとcppファイルの混在するプログラムのCMakeコンパイル

07.02.2016 in using tags C++ , CUDA , CMake

CUDAの.cuファイルと.cppファイルが混在しているプロジェクトのCMakeファイルの書き方についてまとめます.
これまでは,Macでnsightを使ってコードをビルドしていましたが他の環境でもビルドできるようにCMakeを書いてみようと思ってやってみたところ色々ハマったのでやり方をまとめます.

・環境


環境とソースコードのディレクトリ構造は次のようになっています.

OS: OS X 10.9.5
CUDA version: 7.5
CMake version: 3.2.3

  • ディレクトリ構造
    - ProjectDir  
     ├ CMakeList.txt
     └ src
        ├ ~.cpp
        ├ ~.h
        ├ ~.cu
        └ ~.cuh

・CMakeListの書き方


CMakeListは次のようになりました.
オプションの渡し方がこれで正しく渡せているかはわかりませんが,なんとかビルドができるようになりました.
C++のコンパイラに”-std=c++11”のオプションが上手く渡せずに苦労しました.”CUDA_SEPARABLE_COMPILATION”をONにして”CMAKE_CXX_FLAGS”にオプションをsetすることで渡せるみたいです.
“CUDA_NVCC_FLAGS”と”CMAKE_CXX_FLAGS”の設定の仕方が違うのですが,どちらかに統一するとビルド時にオプションが渡せていないようなエラーが出てしまいました.(ここらへんがまだ怪しいです.) cuBLASを使っている場合は”cuda_add_executable”の後に”CUDA_ADD_CUBLAS_TO_TARGET”が必要です.


CMakeList.txt

project (Project)
cmake_minimum_required(VERSION 2.8)
find_package(CUDA REQUIRED)

file(GLOB_RECURSE cpp_srcs src/*.cpp)
file(GLOB_RECURSE h_incs src/*.h)
file(GLOB_RECURSE cuda_srcs src/*.cu)
file(GLOB_RECURSE cuda_incs src/*.cuh)

include_directories(
  src
  /usr/local/cuda/include
)

set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS}; -std=c++11 -gencode arch=compute_30,code=sm_30)
set(CUDA_SEPARABLE_COMPILATION ON)
set(CUDA_PROPAGATE_HOST_FLAGS OFF)
set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS}; "-std=c++11 -O3")
set(CUDA_HOST_COMPILER clang++)
cuda_add_executable(Project ${cpp_srcs} ${cuda_srcs} ${h_incs} ${cuda_incs})
CUDA_ADD_CUBLAS_TO_TARGET(Project)