如何将编译器标志从 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,因此我认为你不能向它传递参数。
我正在尝试 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,因此我认为你不能向它传递参数。