【问题标题】:Compilation errors in a CUDA C project (nvcc compiler)CUDA C 项目中的编译错误(nvcc 编译器)
【发布时间】:2016-03-20 07:58:47
【问题描述】:

我正在开发一个 CUDA C 项目,逐步添加新功能。 一切都很顺利,直到我在代码中添加了一个特定的内核:nvcc 编译器现在给了我 4 个错误,都与同一个内核(新内核)有关。 以下是产生错误的行:

__global__ void update(float* original, float* new, float* current, int nhalf) {  // line 104
  int i = threadIdx.x + blockDim.x*blockIdx.x;  // line 105
  if (i < nhalf) {  // line 106
    current[i] /= nhalf;  // line 107 
    new[i] = (original[i] < current[i]) ? current[i] : original[i]; // line 108  
  }
} 

由于我在 main 函数之前编写内核体,所以我不使用原型。

在主函数中,我在第 384 行启动内核:

update<<<p->gridSize,p->blockSize>>>(p->deviceEnv, p->deviceTrueEnv, p->deviceSmoothTrueEnv, Nhalf);

前三个参数是指向浮点数的指针,而第四个参数只是一个整数。

当我尝试使用 nvcc 进行编译时,出现以下错误:

project.cu(106): error: expected a ")"
project.cu(107): error: identifier "current" is undefined
project.cu(108): error: expected a type specifier
project.cu(384): error: too many arguments in function call

我使用下面的 bash 命令编译:

nvcc -O0 -shared -o libproject.so project.cu -Xcompiler "-fPIC" -I$HOME/include/csound -arch=sm_30 -I/usr/local/cuda/include -L/usr/local/cuda/lib -lcufft -g -G 

我真的很困惑,也因为在同一个项目中我有许多其他非常相似的内核,它们可以正常编译。我以完全相同的方式启动它们而没有任何问题。 有人可以帮我在这里找出问题吗?非常感谢。

PS:我在 Ubuntu 上使用的是 cuda 工具包 7.0。

【问题讨论】:

  • new 是 c++ 中的保留关键字。将该参数名称更改为其他名称,例如 my_new,在参数中和在 update 函数体中使用。
  • 啊,太简单了!非常感谢!
  • @RobertCrovella,顺便说一句,你认为有更好的方法来找到两个数组的元素最大值吗?我想知道这是否是一个低性能的解决方案......(再次感谢您回答所有这些与 cuda 相关的问题)

标签: linux cuda compiler-errors nvcc


【解决方案1】:

这是由于在内核中使用了名称与保留关键字(本例中为new)冲突的变量。

[此社区 wiki 答案已从 cmets 添加,以将此问题从未回答列表中删除]。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-05
    • 1970-01-01
    • 1970-01-01
    • 2019-08-26
    • 1970-01-01
    • 2011-01-21
    • 2012-12-09
    • 1970-01-01
    相关资源
    最近更新 更多