关于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++工程项目的配置

原文地址:https://www.cnblogs.com/rainbow70626/p/8409021.html

时间: 2024-12-14 07:15:02

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

error C2589: &ldquo;(&rdquo;: &ldquo;::&rdquo;右边的非法标记 error C2059: 语法错误 : &ldquo;::

1. 错误输出 ./zlibrary/ui/src/win32/w32widgets/W32VBorderBox.cpp(114) : error C2589: "(": "::"右边的非法标记    ./zlibrary/ui/src/win32/w32widgets/W32VBorderBox.cpp(114) : error C2059: 语法错误 : "::"2. 错误代码举例 size.Width = std::max(size.Wid

[ISSUE][PENDING]cocos2d-x ... error C2059: 语法错误:“-”

在定义的头文件中并没有使用到任何coco2d-x的东西,提示错误 error C2059: 语法错误:“-” (..\..\src\Xxxx.cpp)error C2143: 语法错误 : 缺少“;”(在“}”的前面) (..\..\src\Xxxx.cpp)error C2238: 意外的标记位于“;”之前 (..\..\src\Xxxx.cpp)error C2575: “updateQuadWithParticle”: 只有成员函数和基可以是虚拟的 (..\..\src\Xxxx.cpp)

vs2012 MinGW编译ffmpeg 出现libavdevice/avdevice.c(38) : error C2059: 语法错误:“.”

利用vs2012编译ffmpeg出现以下错误: libavdevice/avdevice.c(38) : error C2059: 语法错误:"." libavdevice/avdevice.c(40) : error C2059: 语法错误:"," libavdevice/avdevice.c(42) : error C2059: 语法错误:"," libavdevice/avdevice.c(44) : error C2059: 语法错误:&

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

错误代码提示: 1>f:\opencv\opencv\build\include\opencv2\flann\lsh_table.h(266): error C2059: 语法错误:“::”f:\opencv\opencv\build\include\opencv2\flann\lsh_table.h(266): error C2589: “(”:“::”右边的非法标记 const size_t key_size_upper_bound = std::min(sizeof(BucketKey)

iOS项目中引用第三方库引发冲突的解决方法

在iOS程序开发过程中,经常会碰见引用第三方库出现类名重复使用,导致冲突. 解决方案 1.使用命令将.a库中的相同的包移除 2.在编译链接项中添加-dead_strip项  补充说明: -dead_strip:删除多余的库符号: -all_load:让链接器把所有找到的目标文件都加载到可执行文件中: -force_load:所做的事情跟-all_load其实是一样的,但是-force_load需要指定要进行全部加载的库文件的路径 使用命令将.a库中的相同的包移除步骤如下: 1.创建临时文件夹(用

struct init 的时候报错 error C2059: 语法错误 &quot;{&quot;

比如: struct kk { int a; int b; }; kk val[2]; val[0] = {0, 0}; val[1] = {1, 1}; 在有些编译器下能通过,在vs2012上编译不过 网上:原来这个新feture Designated initializers 在 vs2012 上支持,需要升级到 vs2013 那就只能有老的初始化的方法了

(iOS)项目总结-项目中遇到的各种的问题和解决方法

前言: 一到公司报道那时,便着手独立的去完成了一个项目,其中的辛酸泪也是不足为外人道也.这次算是一个新型的app,仍然是独立开发,但心境和想法却是完全的不同.下面说一次以前做开发时常常忽略的知识,也算是一种复习了吧.下面言归正传: 1.自带键盘的next用法 这算是比较常用的了吧,只要我们想到登录和注册界面,就应该自然而然的想到 - 键盘的next用法(当然不排除相当多的软件并没有实现这个功能). 想法也就是:用户在输入用户名后,点击next跳转到下一个输入框.其实也不用想的如此复杂,在登录界面

关于项目中所有填写都变成乱码的解决方法--搜索不出记录

表现:搜索不出记录 解决方法: 一,找到tomcat的server.xml文件修改: 默认情况下,tomcat使用的的编码方式:iso8859-1 修改tomcat下的conf/server.xml文件 找到如下代码:    <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />这段代码规

【Grails 代理Proxy设置】部署Grails遇到Error Resolve error obtaining dependencies:错误,及解决方法

最近在使用Grails,一开始使用3.0.2版本,一直包nullpointer错误,后来使用了2.5.0版本,可以创建工程,但是在进入到工程目录后,再执行grails程序,报错了,步骤如下: 1. grails create-app helloworld // 成功 2. cd helloworld 3. grails        // 出错,信息如下 | Configuring classpath | Error Resolve error obtaining dependencies: C