初入CUDA: VS2010+cuda6.0工程的建立

原创作品 转载请注明出http://blog.csdn.net/always2015/article/details/47322551

最近刚接触GPU高性能编程,感觉并行编程太高大上了。他的强大的并行计算也成为了全球研究的热点。下面的程序是在配置好了编译和运行CUDA C代码环境的基础上运行的第一个示例程序。具有纪念的意义。本文的例程是基于教材《GPU高性能编程CUDA编程实战》,这是一本很经典的一步cuda入门参考书,废话不多说,我已经迫不及待去感受cuda的魅力啦。

工程建立

1、打开VS2010,新建–>项目,建立一个空的win32控制台应用程序。如下图所示:

初入CUDA: VS2010+cuda6.0工程的建立_第1张图片

并且给该工程命名为cuda_test,单击确定。

初入CUDA: VS2010+cuda6.0工程的建立_第2张图片

2、然后在下一个窗口中点击“下一步”,然后再在下一个窗口中的”附加选项“中选择”空项目“。点击完成,如图:

初入CUDA: VS2010+cuda6.0工程的建立_第3张图片
初入CUDA: VS2010+cuda6.0工程的建立_第4张图片

3、这样我们就进入了工程的界面,右键源文件—–>添加—->新建项。

初入CUDA: VS2010+cuda6.0工程的建立_第5张图片

4、在打开的对话框中选择建立一个cuda格式的文件,即:NVIDIA CUDA6.0下的code——>CUDA C/C++ file,然后随便起一个名字main,点击添加。

初入CUDA: VS2010+cuda6.0工程的建立_第6张图片

5、右键工程—>生成自定义 如下:

初入CUDA: VS2010+cuda6.0工程的建立_第7张图片

弹出的窗口中选择CUDA6.0 .

初入CUDA: VS2010+cuda6.0工程的建立_第8张图片

6、右键项目—->属性,将项类型设置为:CUDA C/C++。如下图。

初入CUDA: VS2010+cuda6.0工程的建立_第9张图片

至此,平台已经搭建完毕,下面我们就可以运行一个代码来测试一下:

#include
#include

__global__ void add(int a,int b,int*c)
{
    *c=a+b;
}
int main(void)
{
    int c;
    int *dev_c;
    HANDLE_ERROR(cudaMalloc((void**)&dev_c,sizeof(int)));
    add<<<1,1>>>(2,7,dev_c);
    HANDLE_ERROR(cudaMemcpy(&c,dev_c,sizeof(int),cudaMemcpyDeviceToHost));
    printf("2+7=%d\n",c);
    cudaFree(dev_c);
    return 0;
}

注意:上述代码的头文件book.h是《GPU高性能编程CUDA编程实战》整本书例程编写的一个头文件,在运行这个代码是需要包含进去,否则肯定会报错。

运行结果如下:
初入CUDA: VS2010+cuda6.0工程的建立_第10张图片

我们知道在GPU设备上执行的函数称为核函数(Kernel).但是编译器怎么区分函数应该在哪个地方运行呢。我们看到代码就知道了。CUDA C中,增加了global修饰符,这个修饰符告诉编译器这个函数在GPU上运行而不是CPU上运行。

还有就是通过cudaMalloc()来分配内存,这个函数类似于C语言的malloc。但是该函数作用是告诉我们是在GPU上分配内存。第一个参数是指针,指向用于保存的新分配内存的变量。第二个是所分配内存的大小。HANDLE_ERROR(),是一个宏,作为本代码的一个辅助部分,定义在book.h中。这个宏是判断函数调用是否返回了一个错误的值。cudaMemcpy()可以说是GPU内存和主机内存的一个接口,这里的意思是将GPU中内存dev-c的值复制给主机的c。因为在GPU上的指针是不能访问CPU上的内存的,所以通过cudaMemcpy来访问GPU的内存。注意cudaMemcpy最后一个参数是cudaMencpyDeviceToHost,这个参数告诉我们运行时源指针是在GPU内存的一个指针,目的指针是一个CPU内存一个指针。这个函数类似于C语言的Memcpy。要释放cudaMalloc分配的内存,需要调用cudaFree释放,这和函数free行为很类似。

你可能感兴趣的:(【CUDA编程】)