该问题的关键在于理解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=; i<N; i++)
  {
    a[i]=i;
    b[i]=*i;
    c[i]=;
  }
  addKernel(a, b, c, N);
 for(int i=; i<N; i++)
  {
    printf("%d is %d.\n", i, c[i]);
  }
return ;
}

(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=;
  int *dev_b=;
  int *dev_c=;   cudaSetDevice();
  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<<<, >>>(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: 语法错误:“<” ”问题的解决方法的更多相关文章

  1. error C2589: “(”: “::”右边的非法标记 error C2059: 语法错误 : “::

    1. 错误输出 ./zlibrary/ui/src/win32/w32widgets/W32VBorderBox.cpp(114) : error C2589: “(”: “::”右边的非法标记    ...

  2. max 宏定义取消:error C2589: error C2059: 语法错误 : “::”

    原文链接:http://blog.csdn.net/danelumax2/article/details/9172465有修改! 一:关于Pcl和WIndef的冲突: 1. 错误输出 ./zlibra ...

  3. std::min error C2059: 语法错误:“::” 的解决方法

    std::min error C2059: 语法错误:"::" 的解决方法 下面这段代码: size_t n = std::min(count_, num_elements); 编 ...

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

    利用vs2012编译ffmpeg出现以下错误: libavdevice/avdevice.c(38) : error C2059: 语法错误:“.” libavdevice/avdevice.c(40 ...

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

    错误代码提示: >f:\opencv\opencv\build\include\opencv2\flann\lsh_table.h(): error C2059: 语法错误:“::”f:\ope ...

  6. Vue 项目中遇到的跨域问题及解决方法

    原文:https://www.jb51.net/article/137278.htm 问题描述 前端 vue 框架,跨域问题后台加这段代码 header("Access-Control-Al ...

  7. opencv2\core\cuda.hpp(106): error C2059: 语法错误:“常量”

    在 cuda.hpp 中, virtual void free(GpuMat* mat) = 0;   -> virtual void _free(GpuMat* mat) = 0;

  8. 错误 2 error C2059: 语法错误:“::”

    设置项目属性,在预定义处理器中添加定义NOMINMAX来禁止使用Vsual C++的min/max宏定义. 项目属性   ——> C/C++ ——> 预处理器 ——> 预处理器定义 ...

  9. opencv2\flann\matrix.h(69): error C2059: 语法错误:“,”

    在提示错误的matrix.h头文件中,修改一下,在free前加上_ ,即FLANN_DEPRECATED void _free() .

随机推荐

  1. spring mybatis 关于 basepackage 和 mapperLocations 的通配符匹配实例

    SqlSessionFactoryBean mapperLocations 注意下面几点 classpath* mapperLocation 起始路径不能有 * ,如 dm* 就不行 ** list ...

  2. css设置背景模糊

    使用filter属性来设置模糊值 效果: css样式: <style type="text/css"> .cover { width: 600px; height: 3 ...

  3. css3 伪元素和伪类选择器详解

    转自脚本之家:http://www.jb51.net/css/213779.html 无论是伪类还是伪元素,都属于CSS选择器的范畴.所以它们的定义可以在CSS标准的选择器章节找到.分别是 CSS2. ...

  4. ES6框架的搭建

    1.引入traceur.js  http://google.github.io/traceur-compiler/bin/traceur.js 2.将Traceur编译器用于网页 new traceu ...

  5. AJAX 概念 优势 发展前景 工作原理 底层技术 状态 缺点 框架

    1. 概念 Ajax asynchronous JavaScript and XML , 异步js和xml. 这种解释已经过时了, 现在ajax就是, 允许浏览器和服务器通信, 而无需刷新当前页面的技 ...

  6. .NET AOP微型框架发布 --CleanAOP

    CleanAOP--简介 作者:立地(欧文) 邮箱:jarvin_g@126.com 导语: AOP为Aspect Oriented Programming的缩写. 意为:面向切面编程.将日志记录,性 ...

  7. Python语言程序设计学习 之 了解Python

    Python简介 Python是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van Rossum于1989年发明,第一个公开发行版发行于1991年. Python是纯粹的自由软件,源代 ...

  8. 实用爬虫-02-爬虫真正使用代理 ip

    实用爬虫-02-爬虫真正使用代理 ip 因为这里呢,是实用爬虫,想要仔细学习一些基础的,可以去查看: Python 爬虫教程:https://www.cnblogs.com/xpwi/category ...

  9. springboot整合fastdfs实现上传和下载

    FastDFS_Client源码 https://github.com/tobato/FastDFS_Client 友情提示:由于FastDFS_Client这个源码不是很多,并且目前没有找到相关文档 ...

  10. Windows Azure系列公开课 - 第一课:认识云计算

    我们正在经历着一个前所未有的变革时代.信息技术的不断创新也推动着各行业的业务创新. 任何规模和类型的组织都需要拥抱最新的IT趋势才能保持竞争力与创新力,并关注自身的业务. 云计算的最终目标是将计算.服 ...