【问题标题】:CUDA syntax error '<'CUDA 语法错误'<'
【发布时间】:2012-11-29 08:17:24
【问题描述】:

在我的 test.cu 文件中(cu 文件项类型为 CUDA C/C++)

__global__ void foo()
{
}

void CudaMain()
{

  foo<<<1,1>>>();
}

在我的 test.cpp 文件中

#include "mycuda.cu"

int main()
{

CudaMain();
return 0;

}

编译器在 test.cu 文件中向我发送错误“error c2059 syntax error '

【问题讨论】:

  • 我认为它被解析为运算符 > >
  • 我不知道 CUDA 是如何工作的,但在这种情况下,您正在尝试编译(实际上,#include 确实将 .cu 文件中的文本插入到 .cpp 中)'带有 c++ 编译器的 test.cu' 文件,显然不能承受 &lt;&lt;&lt;
  • 您应该将主测试文件命名为test_main.cu(或其他名称)并使用nvcc 进行编译。
  • 我尝试 foo > > 但不起作用
  • 您是否按照getting started guide for windows 中的所有步骤进行操作?您将 .cu 文件包含到 .cpp 文件中,但 ms vc 构建规则正在使用 cpp 构建规则而不是 .cu 构建规则编译 .cpp 文件。所以它会在 .cpp 文件中跳过设备代码。将您的 test.cpp 重命名为 test.cu,以便使用设备构建 (.cu) 规则。

标签: c++ visual-studio-2010 cuda


【解决方案1】:

在 C++ 文件中包含 CUDA 源文件不起作用,因为这只会使 CUDA 源代码成为 C++ 程序代码的一部分,而常规 C++ 编译器不理解 CUDA 语法扩展。如果您仍然希望将 CUDA 代码与非 CUDA C++ 代码分开,那么您可能需要考虑单独编译。 CUDA 源代码可以编译为常规目标文件,然后可以与其他目标文件链接以生成可执行文件。

修改C++代码为:

extern void CudaMain(void);

int main()
{
    CudaMain();
    return 0;
}

使用 nvcc 编译 CUDA 文件,使用 C++ 编译器编译 C++ 代码,然后使用 nvcc 链接生成的目标文件(您可能还需要在链接命令中指定标准 C++ 库):

$ nvcc -c -o test_cuda.o test.cu
$ g++ -c -o test_cpp.o test.cpp
$ nvcc -o test.exe test_cuda.o test_cpp.o -lstdc++

编辑:您的问题是关于 VS2010。可能您必须在那里创建自定义构建步骤。

【讨论】:

  • 这适用于c和c++被链接在一起的情况。在这种情况下,他将 .cu 文件包含到 .cpp 文件中,而不是将它们链接在一起。在这种情况下没有extern 函数调用。
  • 需要我将 cuda *.rules 文件复制到 vs 目录吗?
  • 如果您按照入门说明安装 cuda 安装 ms vs.,则应该已经正确设置了 cuda 规则
  • 谁能给我一个简单的运行时api内核启动示例(+项目文件)..拜托。
  • 请参阅我上面对您的问题的评论。将您的 all .cpp 文件重命名为 .cu
【解决方案2】:

基于这里的线程:https://forums.developer.nvidia.com/t/cuda-build-error/52615/4

您的测试文件扩展名也应该是 .cu,但是如果您使用 MSCV 重命名还不够,您应该在您的 VS 项目中创建一个新的 CUDA C/C++ 源模块。

您还应该在 运算符之间放置空格,例如。

foo< < <1,1> > >();

因为 C++ 无法解析 >>。

【讨论】:

  • 正是这样:"您应该创建一个新的 CUDA C/C++ 源 [..]"
【解决方案3】:

我知道这是一个老问题,但我一直在四处寻找,它让我想起了一个尚未提及的解决方案。

nvcc 帮助提供:

--x {c|c++|cu}                             (-x)
        Explicitly specify the language for the input files, rather than letting
        the compiler choose a default based on the file name suffix.
        Allowed values for this option:  'c','c++','cu'.

所以虽然它是一个有点生硬的工具,但你可以这样做:

nvcc my_source.cpp -x cu ...

它会编译.cpp,就好像它被命名为.cu(即CUDA)。

【讨论】:

    猜你喜欢
    • 2018-03-18
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多