2017-08-21 7 views
3

私は既存のプロジェクトの一部をCUDAコード経由でGPUに移植しようとしています。私はcmakeが別々に.cuファイルを扱うオプション(find_cuda ...)を持っていることを理解していますが、私はまだこのエコシステムを既存のプロジェクトのコンテキストでどのように使用できるか把握しようとしています。既存のプロジェクト(CMake)へのCUDAコードのコンパイル/追加

私の質問は次のとおりです。私はcmake設定ファイル(CMakeLists)を持つ既存のC++プロジェクトを持っているとしましょう。 eleganly(可能であれば)CUDAカーネルを含む現在のプラクティスは何ですか?ある方法でCMakeListを構築できますか?GPUが存在する場合にのみ.cuファイルがコンパイルされますか?

私の現在のアイデアは、CUDA関連のコードだけが存在する別のフォルダを作成し、これを静的ライブラリとしてコンパイルすることです。それはそれを行う方法ですか?

答えて

1

CUDAファイルを別々のフォルダに保存することをお勧めしますが、必須ではありません。基本的な原則は、すべての.cuファイルをCMake変数(CUDA_SRCと呼ぶ)とすべての.cppファイルを別の変数(SRCと呼ぶ)で収集することです。これで、両方のファイルをコンパイルしてまとめます。 find_package(CUDA)によって提供される変数CUDA_FOUNDは、CUDAがシステムにインストールされているかどうかを判断するために使用できます。 cudaファイルに静的ライブラリを使用する必要はありませんが、ここでは両方の方法を示します。静的CUDAなし

find_package(CUDA QUIET) 
if(CUDA_FOUND) 
    include_directories(${CUDA_INCLUDE_DIRS}) 
    SET(ALL_CUDA_LIBS ${CUDA_LIBRARIES} ${CUDA_cusparse_LIBRARY} ${CUDA_cublas_LIBRARY}) 
    SET(LIBS ${LIBS} ${ALL_CUDA_LIBS}) 
    message(STATUS "CUDA_LIBRARIES: ${CUDA_INCLUDE_DIRS} ${ALL_CUDA_LIBS}") 
    set(CUDA_PROPAGATE_HOST_FLAGS ON) 
    set(CUDA_SEPARABLE_COMPILATION OFF) 
    list(APPEND CUDA_NVCC_FLAGS -gencode=arch=compute_30,code=compute_30) 
    list(APPEND CUDA_NVCC_FLAGS -gencode=arch=compute_52,code=sm_52) 
endif() 

静的CUDAライブラリと

if(CUDA_FOUND) 
    #collect CUDA files 
    FILE(GLOB_RECURSE CUDA_SRC *.cu) 
    #build static library 
    CUDA_ADD_LIBRARY(my_cuda_lib ${CUDA_SRC} STATIC) 
    SET(LIBS ${LIBS} ${my_cuda_lib}) 
endif() 

#collect cpp files 
FILE(GLOB_RECURSE SRC *.cpp) 

#compile .cpp files and link it to all libraries 
add_executable(${PROG_NAME} ${SRC}) 
target_link_libraries(${PROG_NAME} ${LIBS}) 

:あなたはCUDAを見つけて、いくつかのNVCCフラグを設定するには、このような何かをしたい、あなたのトップレベルのcmakeのファイルで

lib

FILE(GLOB_RECURSE SRC *.cpp) 

if(CUDA_FOUND) 
    #compile cuda files and add the compiled object files to your normal source files 
    FILE(GLOB_RECURSE CUDA_SRC *.cu) 
    cuda_compile(cuda_objs ${CUDA_SRC}) 
    SET(SRC ${SRC} ${cuda_objs}) 
endif() 

#compile .cpp files and link it to all libraries 
add_executable(${PROG_NAME} ${SRC}) 
target_link_libraries(${PROG_NAME} ${LIBS}) 
+0

素晴らしいです、これはまさに私が知りたかったものです。 –

関連する問題