2017-06-07 1 views
2

je ne peux pas comprendre comment obtenir clang CUDA drapeaux spécifiques pour que les fichiers CUDA:clang 4.0.0 cuda et les meilleures pratiques pour CMake mises en garde minimales

# building all except 20 
set(BUILD_CUDA_ARCH "30;32;35;50;52;53") 

# According to the docs, we need static cudart: 
# http://llvm.org/docs/CompileCudaWithLLVM.html#compiling-cuda-code 
list(APPEND EXTRA_LIBS "cudart_static") 

# Let clang know exactly where cuda came from 
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --cuda-path=${CUDA_TOOLKIT_ROOT_DIR}") 

# Add the compilation trajectories for different architectures 
# go to the docs linked above 
foreach(arch ${BUILD_CUDA_ARCH}) 
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --cuda-gpu-arch=sm_${arch}") 
endforeach() 

# Add the executable like normal, now that CMAKE_CXX_FLAGS has been adjusted. 
# clang will compile the .cu files separately 
add_library(${LIB_NAME} ${LIBRARY_TYPE} ${CXX_INC} ${CXX_SRC} ${CUDA_INC} ${CUDA_SRC}) 

Où ailleurs dans le fichier est défini

  • LIB_NAME: le nom de la bibliothèque construite
  • LIBRARY_TYPE: soit SHARED ou STATIC
  • CXX_INC et CXX_SRC: C++ pur en-têtes/code source
  • CUDA_INC et CUDA_SRC: code CUDA droit
  • EXTRA_LIBS: juste utilisés dans target_link_libraries avec d'autres choses

Le problème est que cette approche se traduit par:

clang-4.0: warning: argument unused during compilation: '--cuda-gpu-arch=sm_30' [-Wunused-command-line-argument] 
clang-4.0: warning: argument unused during compilation: '--cuda-gpu-arch=sm_32' [-Wunused-command-line-argument] 
clang-4.0: warning: argument unused during compilation: '--cuda-gpu-arch=sm_35' [-Wunused-command-line-argument] 
clang-4.0: warning: argument unused during compilation: '--cuda-gpu-arch=sm_50' [-Wunused-command-line-argument] 
clang-4.0: warning: argument unused during compilation: '--cuda-gpu-arch=sm_52' [-Wunused-command-line-argument] 
clang-4.0: warning: argument unused during compilation: '--cuda-gpu-arch=sm_53' [-Wunused-command-line-argument] 

avertissements pour chaque compilation non-cuda. Est-ce que je ai pour séparer ceci en deux bibliothèques séparées, ou est-ce qu'il y a un moyen de dire clang? Les linked docs in the comments semblent indiquer qu'il devrait seulement faire des trucs de cuda avec .cu des dossiers, mais je ne peux pas sembler trouver des drapeaux spécifiques pour seulement ce mode. Il est difficile de le diviser en deux bibliothèques avec la façon dont les choses sont réparties logiquement - la version CPU comprend différents fichiers qui font effectivement la même chose sans le GPU.

Répondre

2

Vous devez ajouter les indicateurs de compilation CUDA en tant que propriétés de compilation cmake uniquement aux fichiers source CUDA, plutôt que de les ajouter de manière unilatérale, puis d'essayer de les supprimer de manière sélective.

+0

Lol DUH c'est bien mieux, puisque j'ai déjà une liste des fichiers qui doivent être configurés pour CUDA, seulement ajouter les drapeaux CUDA! – sjm324

0

Il est un moyen d'ignorer comme indiqué dans this answer

# Squelch warnings about cuda flags for C++ files 
foreach(cxx ${CXX_SRC} ${CXX_INC}) 
    set_source_files_properties(${cxx} PROPERTIES COMPILE_FLAGS -Wno-unused-command-line-argument) 
endforeach() 

Je ne pense pas qu'il soit approprié de donner une couverture -Wno-unused-command-line-argument, mais il semble probable un traitement séparé des drapeaux est pas llvm.