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



为文件提供扩展名.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。这个输出也是几乎完全重复的,但是有10000行。

将文件正常编译为.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或主机代码。

最新更新