跟我一起来学cuda---解决error C2065: “blockIdx”: 未声明的标识符
2014-12-31 10:45
246 查看
由于毕业需要,需要cuda来写毕业论文。楼主小白一枚,跟着开勇的博客开始学习。博客详细地址请参考:/article/2830942.html
《GPU的革命》
首先新建一个win32空项目,进行如下设置:
1、右键源文件文件夹->新建项->选择cuda c/c++->新建一个以.cu结尾的文件
2、右键工程-》生成自定义-》选择cuda生成
3、右键test.cu-》属性-》选择cuda c/c++编译器
4、右键工程-》属性-》链接器-》常规-》附加库目录-》添加目录 $(CUDA_PATH_V5_5)\lib\$(Platform);
5、在链接器-》输入中添加 cudart.lib
6、在工具-》选项-》文本编辑器-》文件扩展名-》添加cu \cuh两个文件扩展名
设置完毕后开始输入代码
生成,会出现如下错误:error C2065: “blockIdx”: 未声明的标识符
检查函数命名为.cpp,把函数名改为.cu问题解决!
这是因为.cpp文件没有使用nvcc来编译
结果如下:
《参考完全来自开勇博客》
作者这里做了一个简单的测试,测试了512个线程。这里只有一个grid,从这一个grid里面也只分了一个bock:
dim3 grid(size_x / BLOCK_DIM,
1);--》 dim3 grid(1, 1);一个Grid里面一个blcok
dim3 block(BLOCK_DIM, 1, 1);--》dim3 block(512,
1, 1);一个Block里面分配512个Thread;
这里的每一个任务kernel就是:
__global__ static void ThreadDemo1(unsigned int* ret)
计算自己的线性id然后把自己的坐标写入到线性id对应的数组里面。Ps:说明一下,这个记录id坐标的数组ret[],ret的前一半记录的是线程的x坐标,后一般是记录的y坐标。PS2:题外话,cu是C的扩展,这里的const定义的常量的用法在ANSIC C里面是行不通的,但是在C++中是可用的。
每个任务kernel都说好了,然后就是host下达命令
ThreadDemo1<<<grid,block>>>(ret);
来运行程序。所有的士兵都开始工作了,把自己的坐标x,y写入到ret数组里面。
另一个新技能get:
上面命令行截图我们都看到,数据多的时候显示不全,那么如何不通过建立文件就直接把命令行的输出写到txt文件呢。
首先还是右键项目属性,打开调试窗口,在命令参数里输入>1.txt,如下图所示:
好了,现在去项目中可以看到1.txt了。
《GPU的革命》
首先新建一个win32空项目,进行如下设置:
1、右键源文件文件夹->新建项->选择cuda c/c++->新建一个以.cu结尾的文件
2、右键工程-》生成自定义-》选择cuda生成
3、右键test.cu-》属性-》选择cuda c/c++编译器
4、右键工程-》属性-》链接器-》常规-》附加库目录-》添加目录 $(CUDA_PATH_V5_5)\lib\$(Platform);
5、在链接器-》输入中添加 cudart.lib
6、在工具-》选项-》文本编辑器-》文件扩展名-》添加cu \cuh两个文件扩展名
设置完毕后开始输入代码
#include<stdio.h> #include<iostream> #include<cuda_runtime.h> using namespace std; /*=============================================================*/ /*************************thread demo***************************/ /*=============================================================*/ #define BLOCK_DIM 512 const int size_x = 512; const int size_y = 1; __global__ static void ThreadDemo1(unsigned int *ret) { unsigned int xIndex = blockDim.x * blockIdx.x + threadIdx.x; unsigned int yIndex = blockDim.y * blockIdx.y + threadIdx.y; if(xIndex < size_x && yIndex < size_y) { unsigned int index = xIndex + size_x * yIndex; ret[index] = xIndex; ret[index + size_x * size_y] = yIndex; } } int main() { unsigned int *ret = 0; unsigned int host_ret[size_x * size_y * 2] = {0}; int i = 0; cudaMalloc((void**)&ret, sizeof(unsigned int)*(size_x*size_y*2)); dim3 grid(size_x / BLOCK_DIM,1); dim3 block(BLOCK_DIM,1,1); ThreadDemo1<<<grid,block>>>(ret); cudaMemcpy(&host_ret,ret,sizeof(unsigned int)*(size_x * size_y * 2),cudaMemcpyDeviceToHost); for(int i = 0; i < size_x * size_y; i++) { printf("(%u,%u)",host_ret[i],host_ret[size_x*size_y+1]); } cudaFree(ret); return 0; }
生成,会出现如下错误:error C2065: “blockIdx”: 未声明的标识符
检查函数命名为.cpp,把函数名改为.cu问题解决!
这是因为.cpp文件没有使用nvcc来编译
结果如下:
《参考完全来自开勇博客》
作者这里做了一个简单的测试,测试了512个线程。这里只有一个grid,从这一个grid里面也只分了一个bock:
dim3 grid(size_x / BLOCK_DIM,
1);--》 dim3 grid(1, 1);一个Grid里面一个blcok
dim3 block(BLOCK_DIM, 1, 1);--》dim3 block(512,
1, 1);一个Block里面分配512个Thread;
这里的每一个任务kernel就是:
__global__ static void ThreadDemo1(unsigned int* ret)
计算自己的线性id然后把自己的坐标写入到线性id对应的数组里面。Ps:说明一下,这个记录id坐标的数组ret[],ret的前一半记录的是线程的x坐标,后一般是记录的y坐标。PS2:题外话,cu是C的扩展,这里的const定义的常量的用法在ANSIC C里面是行不通的,但是在C++中是可用的。
每个任务kernel都说好了,然后就是host下达命令
ThreadDemo1<<<grid,block>>>(ret);
来运行程序。所有的士兵都开始工作了,把自己的坐标x,y写入到ret数组里面。
另一个新技能get:
上面命令行截图我们都看到,数据多的时候显示不全,那么如何不通过建立文件就直接把命令行的输出写到txt文件呢。
首先还是右键项目属性,打开调试窗口,在命令参数里输入>1.txt,如下图所示:
好了,现在去项目中可以看到1.txt了。
相关文章推荐
- 解决error C2065:"..."未声明的标识符,C2065:语法错误: 标识符“...”
- error C2065: “PCONTEXT”: 未声明的标识符 -----问题解决
- 关于错误: error C2065: “CCM_SETWINDOWTHEME”: 未声明的标识符 解决方法
- 解决“error C3861: “pcap_findalldevs_ex”: 找不到标识符”以及“error C2065: “PCAP_SRC_IF_STRING”: 未声明的标识符”问题
- error C2065: “Graphics”: 未声明的标识符解决办法
- 引用其他头文件时出现这种错误,莫名其妙,error C2065: “ColorMatrix”: 未声明的标识符
- 解决T2A W2A A2W的报错error C2065: “_lpw”: 未声明的标识符
- error C2065: “IDD_DIALOG1”: 未声明的标识符
- error C2065: “GUID_NULL”: 未声明的标识符
- error C2065: “m_dbNavDB” : 未声明的标识符
- error C2065: “cout”: 未声明的标识符
- error C2065: “vector”: 未声明的标识符
- error C2065: “Count”: 未声明的标识符
- error C2065: “CString”: 未声明的标识符
- error C2065: “cout”: 未声明的标识符 处理方法
- error C2065: “CMainFrame”: 未声明的标识符
- error C2065: “IDD_DIALOG1”: 未声明的标识符 .
- 使用控件时提示"未声明标识符"的解决方法
- error C2065: “IDD_DIALOG1” : 未声明的标识符
- _CommandPtr未声明的标识符解决办法