【问题标题】:Unrecognized token error when declaring a cudaError_t variable声明 cudaError_t 变量时出现无法识别的令牌错误
【发布时间】:2017-01-02 18:33:10
【问题描述】:

我是 Cuda 的新手,刚开始编写一个简单的程序来测试它。其中可能存在很多问题,但现在对我来说停止的是我在标题中描述的错误:每当我声明一个简单的 cudaError_t 变量时,我都会收到“无法识别的令牌”编译错误。 这是我的代码示例:

#include <cuda_runtime.h>
#include <cuda_runtime_api.h>

extern "C" void callCudaCode(int*);

__global__ void mykernel (int *a, int *b, int *c)
{
    //*c = *a + *b;
    *c = 34;
}


void callCudaCode(int* results)
{
    int a=3, b=8;
    int *da, *db, *dc;
    int size = sizeof(int);

    ​cudaError_t myCudaError;// = cudaGetLastError();
    //const char* errorStr = cudaGetErrorName(cudaError);

    cudaMalloc((void**)da, size);
    cudaMalloc((void**)db, size);
    cudaMalloc((void**)dc, size);

    cudaMemcpy(da, &a, size, cudaMemcpyHostToDevice);
    cudaMemcpy(db, &b, size, cudaMemcpyHostToDevice);

    mykernel<<<1,1>>>(da,db,dc);

    cudaMemcpy(results, dc, size, cudaMemcpyDeviceToHost);

    cudaFree(da);
    cudaFree(db);
    cudaFree(dc);
}

还有另一个使用此文件的 main.cpp 文件,但我认为它与解释此错误无关,因此我没有包含它。 如果我注释 cudaError_t 变量声明,代码编译得很好(它不能正常执行,但那是另一回事了)。

我已经用谷歌搜索了这个问题,但只发现了与我的示例无关的错误:空格错误、printf 错误...

据我了解,cudaError_t 是在 cuda_runtime_api.h 中定义的枚举,因此包含它应该没有任何问题...

有人知道发生了什么吗?

编辑

我刚刚附上的文件是 mycuda.cu。还有另一个名为 main.cpp 的文件,它只调用 mycuda.cu 中的 callCudaCode() 函数。 我正在使用 Qt Creator 和 qmake 来构建项目。是的,我仔细配置了 .pro 文件,这样 Qt 就不会尝试编译 .cu 项目。 如果我注释声明 myCudaError 变量的行,则项目编译得很好。如果我取消注释,我会遇到编译问题。

【问题讨论】:

  • 相关文件的名称是什么 - 您是否使用了以 .cpp 结尾的文件名?
  • 这个文件是 cuda.cu。还有另一个 main.cpp 只是从这个文件中调用 callCudaCode()。
  • 如果文件具有.cu 扩展名,则不需要包含 CUDA 运行时 - nvcc 将自动包含 CUDA 标头。
  • 为了确保我不会以某种方式干扰内部 cuda 机制,我只是将文件重命名为 mycuda.cu。好的,包含是不必要的,我只是删除了它们并且行为没有改变。但是,这也没有解决问题。

标签: c++ cuda


【解决方案1】:

cudaError 是一个保留的 CUDA 关键字。

不要将其用作变量名。

将其更改为:

cudaError_t my_cudaError;

cudaError 已经在driver_types.h 中定义。它是一个枚举类型。)

【讨论】:

  • 谢谢罗伯特的回答,我不知道。我刚刚将变量重命名为 myCudaError 但问题仍然存在。还有什么想法吗?顺便说一句,我正在使用 QtCreator 和 qmake 来构建项目。由于它在没有变量声明行的情况下构建,我想这无济于事,但如果有人觉得这可能有助于诊断错误,请告诉我,我会说出来。
  • 就像 CUDA 一样,QT 也引入了它自己的预处理步骤,根据我的(有限)经验,这些步骤与 CUDA 不兼容。所以最好确保 QT 只处理 .cpp 文件,并且所有 CUDA 代码仅限于 .cu 文件。
  • 已经这样做了。 QT 用于处理 .cu 文件,会有很多编译错误(在我解决这个问题之前就存在)。
【解决方案2】:

线

    ​cudaError_t myCudaError;// = cudaGetLastError();

cudaError_t 之前似乎有一个 Unicode 0x200B“零宽度空格”字符。删除它(如果不确定,删除并重新输入整行)然后重试。

【讨论】:

  • 就是这样。不知道这个空间是如何结束的,但这就是问题所在。谢谢你!
  • 对我来说也一样。我从 NVIDIA 参考网站复制了“cudaError_t”,所以我猜零宽度空间来自那里。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-12
  • 1970-01-01
  • 2021-05-08
  • 1970-01-01
  • 1970-01-01
  • 2020-04-16
  • 1970-01-01
相关资源
最近更新 更多