如何通过CMake为特定CUDA文件添加差异化icpc编译标志?
为CUDA源文件配置差异化icpc编译标志
在nvcc+icpc的混合编译项目中,直接使用set_source_files_properties的COMPILE_FLAGS属性无法生效——因为CUDA源文件的编译由nvcc主导,需要使用CUDA_COMPILE_FLAGS属性传递针对nvcc的编译选项,再由nvcc转发给icpc。
解决方案
针对单个CUDA源文件(如file1.cu)添加差异化icpc编译标志,需修改set_source_files_properties的属性为CUDA_COMPILE_FLAGS,并将icpc标志正确封装到nvcc的--compiler-options参数中:
set_source_files_properties( file1.cu PROPERTIES CUDA_COMPILE_FLAGS "--compiler-options '-Wall,-Werror'" )
关键细节
- 使用
CUDA_COMPILE_FLAGS而非COMPILE_FLAGS:CMake对CUDA源文件有专门的属性处理逻辑,普通COMPILE_FLAGS仅对CXX/C源文件生效。 - 引号嵌套规则:将icpc的多个标志用逗号分隔后用单引号包裹,再传递给nvcc的
--compiler-options,确保nvcc能正确解析并转发给icpc。
完整修改后的CMakeLists.txt示例
将上述配置添加到add_executable之前即可:
set(CMAKE_C_COMPILER "icc") set(CMAKE_CXX_COMPILER "icpc") set(CMAKE_CUDA_COMPILER "nvcc") project(proj LANGUAGES CXX CUDA) set(COMMON_CC_COMPILER_FLAGS -std=c++17 -Wextra -pedantic -Werror -Wall -lstdc++fs) set(COMMON_FLAGS ${COMMON_CC_COMPILER_FLAGS}) string(JOIN ", " COMMON_FLAGS_FOR_CUDA_CC_COMPILER "${COMMON_CC_COMPILER_FLAGS}") string(REPLACE ";" "," COMMON_FLAGS_FOR_CUDA_CC_COMPILER "${COMMON_FLAGS_FOR_CUDA_CC_COMPILER}") set(CMAKE_CUDA_STANDARD 17) set(COMMON_FLAGS_CUDA -ccbin=icpc --compiler-options "${COMMON_FLAGS_FOR_CUDA_CC_COMPILER}") string(REPLACE ";" " " FLAGS "${COMMON_FLAGS}") list(APPEND COMMON_FLAGS -DFLAGS="${FLAGS}") include_directories(${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES}) # 为file1.cu添加差异化icpc编译标志 set_source_files_properties( file1.cu PROPERTIES CUDA_COMPILE_FLAGS "--compiler-options '-Wall,-Werror'" ) add_executable(proj main.cu file1.cu file2.cu) target_compile_options(proj PRIVATE $<$<COMPILE_LANGUAGE:CXX>:${COMMON_FLAGS}> $<$<COMPILE_LANGUAGE:CUDA>:${COMMON_FLAGS_CUDA}>)
验证
执行VERBOSE=1 make查看file1.cu的编译命令,会看到nvcc参数中追加了--compiler-options '-Wall,-Werror',icpc将接收到这些额外的编译标志。
内容的提问来源于stack exchange,提问作者Amit
相关产品推荐
相关产品推荐

