跟我一起来学cuda---解决error C2065: “blockIdx”: 未声明的标识符

由于毕业需要,需要cuda来写毕业论文。楼主小白一枚,跟着开勇的博客开始学习。博客详细地址请参考:http://blog.csdn.net/openhero/article/details/42131771

《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
#include
#include
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<<>>(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”: 未声明的标识符

跟我一起来学cuda---解决error C2065: “blockIdx”: 未声明的标识符_第1张图片

检查函数命名为.cpp,把函数名改为.cu问题解决!

这是因为.cpp文件没有使用nvcc来编译

结果如下:

跟我一起来学cuda---解决error C2065: “blockIdx”: 未声明的标识符_第2张图片

《参考完全来自开勇博客》
作者这里做了一个简单的测试,测试了 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 intret)
计算自己的线性 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,如下图所示:

         跟我一起来学cuda---解决error C2065: “blockIdx”: 未声明的标识符_第3张图片

好了,现在去项目中可以看到1.txt了。

你可能感兴趣的:(cuda)