关于CUDA C 项目中“ error C2059: 语法错误:“<” ”问题的解决方法
2018-02-03 11:46
696 查看
该问题的关键在于理解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文件,添加代码如下:
(2)将kernel.cu文件清空后写入下述代码:
(3)编译执行。结果如下所示
这时显示是成功的。
(4)把main.cpp中的注释行取消注释,重新编译执行。结果如下所示:
出现文中所述问题。
参考链接:
1、关于CUDA C 项目中“ error C2059: 语法错误:“<” ”问题的解决方法
2、调用cuda程序<<<>>>部分报错error C2059: 语法错误:“<“
3、VS2012安装CUDA
4、VS中CUDA与C++工程项目的配置
发生该语法错误的原因是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 ; int b ; int c ; 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: 语法错误:“<” ”问题的解决方法
- 关于项目文件导入打开报:无法识别元素 <Target> 中的属性“Returns”错误解决方法
- 关于项目文件导入打开报:无法识别元素 <Target> 中的属性“Returns”错误解决方法
- VC 使用ADO连接数据库的问题!error C2059: 语法错误 : “<L_TYPE_raw>”
- 关于“未指定的错误”的问题 的比较正解的解决方法
- 【转】关于Android4.0 emulator-arm.exe-应用程序错误,内存不能为"read"问题解决方法
- 关于"update语句的语法错误"的解决方法
- Eclipse中导入android项目名前有红叉但项目内文件无错误问题解决方法
- 关于allegro16.6 orCAD capture CIS 创建网表出现错误的问题解决方法
- 因为与关键字冲突而导致的"update语句的语法错误"问题解决方法
- 关于html中charset与<title>位置不同页面空白的问题及解决方法
- 关于ISA2004内网卡网线拔插造成ISA代理失效问题的一种解决方法(下列错误而失败:0x80072
- 关于Android开发导入已有项目遇到Project has no default.properties file! Edit the project properties to set one.问题的解决方法
- Eclipse中导入android项目名前有红叉但项目内文件无错误问题解决方法
- WPF项目报 未能找到程序集“<程序集名>”错误的解决方法
- 关于PhotoShop中保存CMYK格式TIFF文件在GDI+错误地显示颜色的问题解决方法
- 关于Android4.0 emulator-arm.exe-应用程序错误,内存不能为"read"问题解决方法
- 关于“未指定的错误”的问题 的比较正解的解决方法
- 关于android导入工程时出现的@Override错误问题的解决<转>