【问题标题】:typedef not recognizable in CUDAtypedef 在 CUDA 中无法识别
【发布时间】:2012-11-02 17:58:28
【问题描述】:

我正在尝试将 cpp 文件转换为 .cu 文件。但是,编译器会报告 cpp 中所有 typedef 和静态函数的错误。它也不会检测范围解析运算符并为它们报告错误。

【问题讨论】:

  • 显然 CUDA 正在为许多其他人工作,所以您能否更具体一些并展示一些不起作用的(独立的)代码?
  • 我已经有一个现有的项目。我们计划将一个 cpp 文件迁移到一个 cu 文件。在编译这个 cu 文件时,我们得到了错误。例如。 typedef 无符号长 ULONG;如果我在函数声明中使用 Func(ULONG uLine);我收到一个错误“标识符 ULONG 未定义”
  • 嗯,这不会发生在很多其他人身上,所以一定有特定于您的程序的东西导致了这种行为,我们需要查看代码来识别它。但是,我的一般建议是不要尝试将现有的大型代码转换为 .cu 文件,而是将内核启动和 CUDA 调用包装成从现有 .cpp 文件调用的小函数。
  • 我会把这个建议变成下面的答案。

标签: c++ cuda


【解决方案1】:

CUDA 对预处理器宏的扩展方式进行了一些重大更改,因为它通过预处理器多次运行代码以扩展 CUDA 结构并分离主机和设备代码。这可能会破坏现有的大型代码库。

在这种情况下(即使是新编写的项目)我的一般策略是将所有现有代码保留在 .cpp 文件中,并且只将尽可能少的代码移动到 .cu 文件中。我只是将 .cu 文件和 .cpp 文件中所需的 typedef 和定义移动到单独的头文件中,并围绕 CUDA 调用和内核启动编写小型包装函数,然后从现有的 .cpp 文件中调用它们。

【讨论】:

  • 同意...但我还没有实现任何 CUDA API 调用。我刚刚在我现有的项目中添加了一个 cu 文件。而我的第一步是编译cu文件
  • @sameer karjatkar 您所看到的问题的一个简单的可编译示例,以及您如何编译它的定义,将有所帮助,如前所述。例如,在this SO question 中,代码在问题开头的粘贴箱中提供。该代码编译得很好,并在顶部使用 typedef unsigned int uint; 并在整个代码中使用 uint,没有任何编译问题。像“编译器正在报告所有类型定义的错误”这样的声明是不够的。
  • 好的 ..正如@tera 建议的那样,我创建了一个名为 .cuh 的单独头文件。我已将此文件添加到我的项目中。我将这个 cuh 文件包含在我的 cpp 文件中。现在我构建模块......现在编译器无法识别 global 关键字。函数是 global void kernel(int *a, int *b) { int tx = threadIdx.x;开关(TX){案例0:*a=*a+10;休息; } }
  • 你使用的是哪个编译器?
  • 任何设备代码都必须以 .cu 文件结尾并传递给 nvcc。您可以从 cpp 文件调用 .cu 文件中的 C/C++ 函数。您可能想查看cpp integration sample。听起来你正在使用Windows。您应该首先验证您是否可以编译和构建示例项目(如 cpp 集成)。如果您已经更改了 cuda 构建规则,我认为这是自找麻烦。
猜你喜欢
  • 1970-01-01
  • 2015-04-15
  • 1970-01-01
  • 1970-01-01
  • 2012-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-20
相关资源
最近更新 更多