为什么 cuda 文件的 clang 预处理输出重复?

Why is the preprocessing output of clang duplicated for cuda files?

给文件扩展名 .cu 会导致 clang 的预处理输出 (-E) 被复制:

$ cat main.cu
int main(){}

$ clang -E -nocudalib -nocudainc main.cu
# 1 "main.cu"
# 1 "<built-in>" 1
# 1 "<built-in>" 3
# 666 "<built-in>" 3
# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "main.cu" 2
int main(){}
# 1 "main.cu"
# 1 "<built-in>" 1
# 1 "<built-in>" 3
# 665 "<built-in>" 3
# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "main.cu" 2
int main(){}

使用.c时似乎正常:

$ cat main.c
int main(){}

$ clang -E -nocudalib -nocudainc main.c
clang: warning: argument unused during compilation: '-nocudainc' [-Wunused-command-line-argument]
# 1 "main.c"
# 1 "<built-in>" 1
# 1 "<built-in>" 3
# 341 "<built-in>" 3
# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "main.c" 2
int main(){}

根据警告,我推断 clang 实际上正确地检测到它是一个 CUDA 文件。我也可以在没有 -nocudainc -nocudalib 的情况下进行编译,例如 clang -E --cuda-gpu-arch=sm_50 main.cu。此输出也几乎完全重复,但有 10,000 行。

.cu.c 正常编译文件。如果我将预处理器输出保存为 .i 文件,我可以编译 .c 文件的输出,但不能编译 .cu 文件的输出:

$ clang main.i
main.cu:1:5: error: redefinition of 'main'
int main(){}
    ^
main.cu:1:5: note: previous definition is here
int main(){}
    ^
1 error generated.

我想知道为什么输出重复,如果我能避免它。

输出重复,因为 clang 分别为主机和设备 (GPU) 编译 CUDA。您可以使用 --cuda-device-only--cuda-host-only 分别只输出 gpu 或主机代码。