如何将编译器标志从 clang 传递给 nvcc

How to pass compiler flags to nvcc from clang

我正在尝试 compile CUDA with clang,但我正在尝试编译的代码取决于特定的 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?

看来是不可能了

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 标志。

如果您仅在主机端使用特定于 clang 的功能,而在设备端实际上不需要它 - 您可能正在寻找这个:

https://devblogs.nvidia.com/separate-compilation-linking-cuda-device-code/

正如@Increasingly-Idiotic 指出的那样 - 我相信 clang 内部不会 "call" nvcc,因此我认为你不能向它传递参数。