为文件提供扩展名.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或主机代码。