关于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=; 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: 语法错误:“<“
关于CUDA C 项目中“ error C2059: 语法错误:“<” ”问题的解决方法的更多相关文章
- error C2589: “(”: “::”右边的非法标记 error C2059: 语法错误 : “::
1. 错误输出 ./zlibrary/ui/src/win32/w32widgets/W32VBorderBox.cpp(114) : error C2589: “(”: “::”右边的非法标记 ...
- max 宏定义取消:error C2589: error C2059: 语法错误 : “::”
原文链接:http://blog.csdn.net/danelumax2/article/details/9172465有修改! 一:关于Pcl和WIndef的冲突: 1. 错误输出 ./zlibra ...
- std::min error C2059: 语法错误:“::” 的解决方法
std::min error C2059: 语法错误:"::" 的解决方法 下面这段代码: size_t n = std::min(count_, num_elements); 编 ...
- vs2012 MinGW编译ffmpeg 出现libavdevice/avdevice.c(38) : error C2059: 语法错误:“.”
利用vs2012编译ffmpeg出现以下错误: libavdevice/avdevice.c(38) : error C2059: 语法错误:“.” libavdevice/avdevice.c(40 ...
- 解决error C2059: 语法错误:“::”问题
错误代码提示: >f:\opencv\opencv\build\include\opencv2\flann\lsh_table.h(): error C2059: 语法错误:“::”f:\ope ...
- Vue 项目中遇到的跨域问题及解决方法
原文:https://www.jb51.net/article/137278.htm 问题描述 前端 vue 框架,跨域问题后台加这段代码 header("Access-Control-Al ...
- opencv2\core\cuda.hpp(106): error C2059: 语法错误:“常量”
在 cuda.hpp 中, virtual void free(GpuMat* mat) = 0; -> virtual void _free(GpuMat* mat) = 0;
- 错误 2 error C2059: 语法错误:“::”
设置项目属性,在预定义处理器中添加定义NOMINMAX来禁止使用Vsual C++的min/max宏定义. 项目属性 ——> C/C++ ——> 预处理器 ——> 预处理器定义 ...
- opencv2\flann\matrix.h(69): error C2059: 语法错误:“,”
在提示错误的matrix.h头文件中,修改一下,在free前加上_ ,即FLANN_DEPRECATED void _free() .
随机推荐
- 运行javac编译报错:仅当显式请求注释处理时才接受类名称“xxxxxx”
发生原因:运行javac编译时没有加上扩展名.解决方法:加上.java扩展名重新编译即可,"xxxxxx.java".
- 一文看懂大数据的技术生态圈,Hadoop,hive,spark都有了
一文看懂大数据的技术生态圈,Hadoop,hive,spark都有了 转载: 大数据本身是个很宽泛的概念,Hadoop生态圈(或者泛生态圈)基本上都是为了处理超过单机尺度的数据处理而诞生的.你可以把它 ...
- BZOJ3625: 小朋友和二叉树
传送门 Sol 设 \(f_x\) 表示权值为 \(x\) 的二叉树的个数 设 \(s_x\) 表示是否有 \(x\) 这种权值可以选择 那么 \[f_n=\sum_{i=0}^{n}\sum_{j= ...
- System Test GIS压力测试利器
System Test是ESRI公司提供一个压力测试软件.能针对ArcGIS Server 地图服务.WMS服务.WFS服务.WCS服务接口进行压力测试.以下是一个针对ArcGIS Server 地图 ...
- Android 显示html标签或者带图片
Android中显示html文件要用Html.fromHtml(...)处理过的返回值,返回值可以成为setText()的参数. 只显示带文本的html可以用下面的方法处理html文件. public ...
- thinkPHP -01- thinkPHP5.0 安装与测试
thinkPHP -01- thinkPHP5.0 安装与测试 1.thinkPHP 5 官网下载地址:http://www.thinkphp.cn/down.html 2.打开 Wampserver ...
- JAVA中获取文件的大小和文件的扩展名
一.获取文件扩展名(该段代码来自博客园网站装男人的博客https://www.cnblogs.com/nanrenzhuang/archive/2013/05/19/6315546.html) pub ...
- django1.8 增加注册用户其他字段(用户扩展)
在V1.6及之后版本已经删除get_profile()方法,需要使用userprofile. 1.新建moduel,名为UserProfile: class UserProfile(models.Mo ...
- 乘风破浪:LeetCode真题_016_3Sum Closest
乘风破浪:LeetCode真题_016_3Sum Closest 一.前言 这一次,问题又升级了,寻找的是三个数之和最靠近的某个数,这是非常让人难以思考的,需要把三个数相加之后和最后给的目标 ...
- UNIX crontab自动执行脚本
crontab 是不会加载环境变量的你手动执行可以是因为登录了oracle用户加载了环境变量,你可以在脚本里添加,echo $ORACLE_HOME echo $ORACLE_SID 等等试试,看看 ...