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