C++ 如何将编译器标志从clang传递到nvcc

C++ 如何将编译器标志从clang传递到nvcc,c++,cuda,cross-compiling,clang++,ptx,C++,Cuda,Cross Compiling,Clang++,Ptx,我正在尝试,但我正在尝试编译的代码取决于特定的nvcc标志(-每个线程的默认流)。我怎样才能告诉clang将旗帜传递给nvcc 例如,我可以使用nvcc进行编译,EverythSign工作正常: nvcc -default-stream per-thread *.cu -o app 但是,当我从clang编译时,程序的行为不正确,因为我无法传递default steam标志: clang++ --cuda-gpu-arch=sm_35 -L/usr/local/cuda/lib64 *.cu

我正在尝试,但我正在尝试编译的代码取决于特定的nvcc标志(
-每个线程的默认流
)。我怎样才能告诉clang将旗帜传递给nvcc

例如,我可以使用nvcc进行编译,EverythSign工作正常:

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和其他一些东西来创建二进制文件

e、 g

从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的功能,而在设备端实际不需要它,那么您可能正在寻找:


正如@creating Idiotic所指出的,我相信clang不会在内部“调用”nvcc,因此我认为您不能向它传递参数。

这不是关于clang的编译器标志的一般答案,但对于这个特殊的(
-每个线程的默认流
),表明获得相同功能的替代方法是“
\define
在包含CUDA头文件(CUDA.h或CUDA\u runtime.h)之前定义
CUDA\u API\u PER\u THREAD\u DEFAULT\u STREAM
预处理器宏。”这可能值得尝试一下clang。谢谢,这篇博客文章对这种情况非常有用。无论出于何种原因,在使用clang编译时添加define都不起作用(但在使用nvcc时会发生这种情况?)。无论如何,那篇文章给了我足够的信息,让我可以尝试找出其他的东西。非常感谢!请注意,在包含cuda_runtime_api.h之前,定义必须到位。因此,正如博客所述,定义不适用于nvcc,因为nvcc会在处理任何文件之前将包含的内容预先添加到文件中。我很抱歉不太熟悉clang,所以我不确定clang在处理cuda文件时是否会这样做。可能是这样,这可能解释了为什么它不在那里工作。我尝试直接在cuda_runtime.h的顶部添加define,它适用于nvcc,但不适用于clang。如果需要在包含cuda_runtime.h之前定义宏,则需要通过
-D
传递给clang。在引擎盖下clang预先包含了一堆CUDA头(nvcc也是如此),因此在源代码中定义宏不会产生效果,因为在包含CUDA_runtime.h后编译器会看到这一点。
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