您的位置:首页 > 其它

跟我一起来学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两个文件扩展名

设置完毕后开始输入代码

#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了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: