关于CUDA C 项目中“ error C2059: 语法错误:“<” ”问题的解决方法

Posted rainbow70626

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于CUDA C 项目中“ error C2059: 语法错误:“<” ”问题的解决方法相关的知识,希望对你有一定的参考价值。

  该问题的关键在于理解CUDA项目中C\\C++文件需要由c++编译器进行编译,而CUDA C的源文件需要由CUDA的编译器nvcc.exe进行编译。

       发生该语法错误的原因是cu文件被C++编译器所编译,C++编译器无法识别 “<<<”,导致报错。

       为什么cu文件会被C++编译器所编译呢?原因在于我们使用#include将cu文件包含到了C++文件中。对于#include的用途,更简单的理解就是把几个文件合并成一个文件,所以,当编译C++文件中,包含其中的cu文件也会被编译,从而导致 “<<<”运算符被C++编译器编译,导致语法错误。

 

问题原因:不能直接把cuda程序放入cpp中去调用,即核函数的调用语句add<<<2, 128>>>(dev_a, dev_b, dev_c,size);  不能出现在 .cpp 文件中。

解决办法:可以在 .cu 文件中封装一层,就是在 .cu 文件中写一个传同样参数的核函数调用函数addKernel(int *a, int *b, int *c, int size),即在addKernel(int *a, int *b, int *c, int size)函数中调用核函数add<<<2, 128>>>(dev_a, dev_b, dev_c,size),然后在外边main.cpp文件中用调用普通函数的方法调用addKernel(int *a, int *b, int *c, int size)函数,此外需要在addKernel(int *a, int *b, int *c, int size)函数的定义之处和main.cpp文件头部将addKernel(int *a, int *b, int *c, int size)声明为外部函数,即需要用extern "C" 声明。这也是为什么在调用cu文件中核函数的间接调用函数addKernel(int *a, int *b, int *c, int size)时我们需要使用 extern “C”。

示例如下:

(1)创建一个CUDA 6.5 的项目,新建一个main.cpp文件,添加代码如下:

#include <stdio.h>  
#include <stdlib.h>  
//#include "kernel.cu"  
   
#define N 256
extern "C" void addKernel(int *a, int *b, int *c, int size); 

int main(int argc, char **argv)  
{  
  int a[N];  
  int b[N];  
  int c[N];  
   
  for (int i=0; i<N; i++)  
  {  
    a[i]=i;  
    b[i]=2*i;  
    c[i]=0;  
  } 
  addKernel(a, b, c, N);     
  for(int i=0; i<N; i++)  
  {  
    printf("%d is %d.\\n", i, c[i]);  
  }  
   return 0;  
}

(2)将kernel.cu文件清空后写入下述代码:

#include "cuda_runtime.h"  
#include "device_launch_parameters.h"  
   
__global__ void add(const int *a, const int *b, int *c, int size)  
{  
  int tid = threadIdx.x + blockIdx.x * blockDim.x;  
  c[tid] = b[tid] + a[tid];  
}  
   
extern "C" void addKernel(const int *a, const int *b, int *c, int size)  
{  
  int *dev_a=0;   
  int *dev_b=0;   
  int *dev_c=0;  
   
  cudaSetDevice(0);  
  cudaMalloc((void**)&dev_a, sizeof(int)*size);  
  cudaMalloc((void**)&dev_b, sizeof(int)*size);  
  cudaMalloc((void**)&dev_c, sizeof(int)*size);  
  cudaMemcpy(dev_a, a, sizeof(int)*size, cudaMemcpyHostToDevice);  
  cudaMemcpy(dev_b, b, sizeof(int)*size, cudaMemcpyHostToDevice);  
  cudaMemcpy(dev_c, c, sizeof(int)*size, cudaMemcpyHostToDevice);  
   
  add<<<2, 128>>>(dev_a, dev_b, dev_c,size);  
   
  cudaMemcpy(c, dev_c, size * sizeof(int), cudaMemcpyDeviceToHost);  
   
  cudaFree(dev_a);  
  cudaFree(dev_b);  
  cudaFree(dev_c);  
}  

(3)编译执行。结果如下所示

这时显示是成功的。

(4)把main.cpp中的注释行取消注释,重新编译执行。结果如下所示:

出现文中所述问题。

 

参考链接:

1、关于CUDA C 项目中“ error C2059: 语法错误:“<” ”问题的解决方法

2、调用cuda程序<<<>>>部分报错error C2059: 语法错误:“<“

3、VS2012安装CUDA

4、VS中CUDA与C++工程项目的配置

以上是关于关于CUDA C 项目中“ error C2059: 语法错误:“<” ”问题的解决方法的主要内容,如果未能解决你的问题,请参考以下文章

C语言错误 error C2059: 语法错误:“)”以及 错误error C2065: “sockaddr”: 未声明的标识符

qt中出现error: C2059: 语法错误:“namespace”未定义等大量错误的问题

error C2041: illegal digit ‘9‘ for base ‘8‘ | error C2059: syntax error: ‘bad suffix on number‘

解决error C2059: 语法错误:“::”问题

突然出现错误gdiplustypes.h(280): error C2059: syntax error : 'constant'等未知错误

如何在 Visual Studio 2008 中启动新的 CUDA 项目?