【问题标题】:Why is the preprocessing output of clang duplicated for cuda files?为什么cuda文件的clang预处理输出重复?
【发布时间】:2021-01-11 15:32:49
【问题描述】:

为文件提供扩展名 .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 用于 CUDA 代码的编译轨迹的产物,您对此无能为力

标签: cuda clang c-preprocessor


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-11
    • 1970-01-01
    • 2016-01-20
    • 1970-01-01
    相关资源
    最近更新 更多