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})
在文件的其他地方定义
LIB_NAME
:正在构建的库名
LIBRARY_TYPE
:SHARED
或 STATIC
CXX_INC
和 CXX_SRC
:纯 C++ 头文件/源代码
CUDA_INC
和 CUDA_SRC
:直接 CUDA 代码
EXTRA_LIBS
:刚刚在 target_link_libraries
中与其他内容一起使用
问题是这种方法会导致:
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 编译的警告。我 有 将它分成两个单独的库,还是有什么方法可以告诉 clang
? linked 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 编译属性,而不是单方面添加它们,然后尝试有选择地抑制它们。
我不知道如何为 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})
在文件的其他地方定义
LIB_NAME
:正在构建的库名LIBRARY_TYPE
:SHARED
或STATIC
CXX_INC
和CXX_SRC
:纯 C++ 头文件/源代码CUDA_INC
和CUDA_SRC
:直接 CUDA 代码EXTRA_LIBS
:刚刚在target_link_libraries
中与其他内容一起使用
问题是这种方法会导致:
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 编译的警告。我 有 将它分成两个单独的库,还是有什么方法可以告诉 clang
? linked 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 编译属性,而不是单方面添加它们,然后尝试有选择地抑制它们。