clang 4.0.0 cuda 和 cmake 最小警告的最佳实践

clang 4.0.0 cuda and cmake best practices for minimal warnings

我不知道如何为 CUDA 文件获取 clang CUDA 特定标志:

# 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})

在文件的其他地方定义

问题是这种方法会导致:

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]

每个 非 cuda 编译的警告。我 将它分成两个单独的库,还是有什么方法可以告诉 clanglinked docs in the comments 似乎表明它应该只对 .cu 文件执行 cuda 操作,但我似乎无法找到仅适用于该模式的特定标志。将它分成两个逻辑上如何拆分的库感觉很尴尬 - CPU 版本包含不同的文件,这些文件有效地做同样的事情 w/o gpu.

有一种方法可以忽略它,如图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()

我认为不适合提供毯子 -Wno-unused-command-line-argument,但似乎 llvm 中没有单独处理标志。

您应该仅将 CUDA 编译标志添加为 CUDA 源文件的 cmake 编译属性,而不是单方面添加它们,然后尝试有选择地抑制它们。