首页 > 解决方案 > 如何将编译器标志从 clang 传递给 nvcc

问题描述

我正在尝试使用 clang 编译 CUDA,但我尝试编译的代码取决于特定的 nvcc 标志 ( -default-stream per-thread)。我如何告诉 clang 将标志传递给 nvcc?

例如,我可以使用 nvcc 进行编译,并且一切正常:

nvcc -default-stream per-thread *.cu -o app

但是当我从 clang 编译时,程序运行不正确,因为我无法传递default-steam标志:

clang++ --cuda-gpu-arch=sm_35 -L/usr/local/cuda/lib64 *.cu -o app -lcudart_static -ldl -lrt -pthread

如何让 clang 将标志传递给 nvcc?

标签: c++cudacross-compilingclang++ptx

解决方案


看起来这可能是不可能的。

nvcc 在幕后使用一些自定义生成的标志调用 clang/gcc,然后调用 ptxas 和其他一些东西来创建二进制文件。

例如

nvcc -default-stream per-thread foo.cu
# Behind the scenes
gcc -custom-nvcc-generated-flag -DCUDA_API_PER_THREAD_DEFAULT_STREAM=1 -o foo.ptx
ptxas foo.ptx -o foo.cubin

从clang编译成CUDA时,clang直接编译成ptx,然后调用ptxas:

clang++ foo.cu -o app -lcudart_static -ldl -lrt -pthread
# Behind the scenes
clang++ -triple nvptx64-nvidia-cuda foo.cu -o foo.ptx
ptxas foo.ptx -o foo.cubin

clang 从来没有真正调用过 nvcc。它只是针对 ptx 并调用 ptx 汇编程序。

除非您知道 nvcc 将生成哪些自定义后端标志并在调用 clang 时手动包含它们,否则我不确定您是否可以自动从 clang 传递 nvcc 标志。


推荐阅读