如何在CMAKE中向nvcc编译器传递标志

15

我有一个 C 语言项目,使用 Cmake,其中嵌入了 cuda内核模块

我想仅将 --ptxas-options=-v 传递给 nvcc,以便查看每个线程的寄存器使用量和每个块的共享内存使用量

通过搜索如何在 Cmake 中向 nvcc 传递标志,我找到了一个解决方案

(翻译仅供参考,不代表准确性和完整性)

add_compile_options(myprog
    PRIVATE
    $<$<COMPILE_LANGUAGE:C>:-Wall>
    $<$<COMPILE_LANGUAGE:CUDA>:-arch=sm_20 -ptxas-options=-v>
)

但这并没有显示我上面提到的属性。我认为这些标志没有被正确地传递给nvcc

我如何将--ptxas-options=-v传递给我的nvcc编译器?


1
我认为你要找的是target_compile_options,而不是add_compile_options - havogt
target_compile_options(myprog PUBLIC $<$<COMPILE_LANGUAGE:CUDA>:--ptxas-options=-v>) 起作用了。 - Nouman Tajik
3个回答

23

在一个目标上设置CUDA标志的正确方法仅限于

target_compile_options(<my_target> PRIVATE $<$<COMPILE_LANGUAGE:CUDA>:my_cuda_option>) 

通过生成器表达式,这将仅为编译为CUDA语言的文件设置选项。

使用其他答案建议的CMAKE_CUDA_FLAGS会为所有目标设置全局属性,这可能或可能不是正确的方法,具体取决于用例。


1
这个答案更加精确,设置CMAKE_CUDA_FLAGS是一个临时的解决方法。 - Michael

16

使用新的cmake cuda方法会设置其他变量。在此处检查文档

我们需要设置CMAKE_<LANG>_FLAGS,而这里实际上是指CMAKE_CUDA_FLAGS

set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} --ptxas-options=-v")

1
如何?...
find_package( CUDA REQUIRED )
set( CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS}" "--ptxas-options=-v" )

include_directories( ${CUDA_INCLUDE_DIRS} )
cuda_add_library( kernel_lib ${sources} )    

你可以在线查看CMake CUDA文档... https://cmake.org/cmake/help/latest/module/FindCUDA.html

请确保您使用cuda__add ... target命令进行编译。 - KlingonJoe
你还应该考虑拆分你的CMakeLists.txt文件。里面有很多东西。考虑将一些内容发送到/config目录,并添加子目录——将C和CUDA代码分别放在不同的目录中是一个好主意。 - KlingonJoe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接