jameshzd的个人博客分享 http://blog.sciencenet.cn/u/jameshzd

博文

CUDA简单介绍(一)

已有 5372 次阅读 2012-10-25 01:31 |个人分类:并行计算|系统分类:科研笔记| 并行计算, GPU

下面对CUDA和GPU做几个声明:
  • GPU是作为CPU的“辅助计算设备”来使用的。也就是说,在CPU上效率较低的大规模的平行计算模块可以放入GPU中去执行,能增加整体的速度。但是千万不要讲原来CPU上很快的串行代码也奢望放到GPU上。不仅比较困难,也没有太大的帮助。“术业有专攻”,这句话不无道理。
  • CUDA C是C语言的超集(superset),也就是说,.cu的CUDA程序最根本的它是一个C程序,所有C语言中的语法都可以再CUDA C中实现。
要想用好CUDA,先想想我们要把一只大象装进一个冰箱里面冷冻,并且在将大象冻僵之后取出。需要什么条件?以及具体的步骤。
先说说条件:
  • 一只大象(这是必须的,如果连大象都没有,何谈装呢?)
  • 一个有门的冰箱(同理)
下面开始谈方法:
  • 将冰箱的门打开
  • 把大象塞进去
  • 等待冷却。。。
  • 把冰箱门打开
  • 把大象取出来。
可能大家觉得我在说废话。但是GPU中很重要的命令恰巧可以和这些基本操作互相对应,下面我来一一讲解:
  • 要有冰箱:这就要求我们要在GPU上为数据开辟一段内存空间。所用的指令就是cudaMalloc((void**)&pointer_name,size);size是所需要alloc内存的大小,pointer_name就是指向GPU内存的指针(在申请指针名的时候,最好将device端和host端的指针分开,否则有的时候会乱掉。)。而且这样也能保证我们在传指针到kernel函数的时候不至于出错(kernel函数只接受GPU上的内存指针)。
  • 把大象塞进去:要求我们有从CPU到GPU的管道。这个函数式cudaMemcpy(to,from,size,enum);其中的to代表数据传向的指针,from代表数据开始的指针,size是大小,enum是一个枚举量,它有四种不同的值,分别是:cudaMemcpyDeviceToHost(数据从GPU传向CPU);cudaMemcpyHostToDevice(数据从CPU传向GPU);cudaMemcpyHostToHost(数据从CPU传向CPU);cudaMemcpyDeviceToDevice(数据从GPU传向GPU);有了这个函数,我们CPU到GPU的通道就解决了。当然,更细致的时候我们还知道,GPU在这里的内存是global memory。在GPU端,内存的架构和内部的调度非常复杂。需要另外一篇博文来认真的探讨。
  • 等待冷却:GPU中有了数据后,我们就可以在上面进行运算操作了。这也就是GPU计算最核心的部分。如何在GPU上进行有效的线程管理,如何利用SM中的share memory和SP中的register。这是作为一个高级GPU开发者必须要掌握的基本知识,无奈现在我还没有掌握。但是或许在几个星期以后,我能把它搞懂!在这里需要注意的一个语法是kernel函数的定义,kernel函数是在CPU端调用GPU端代码的一个入口,kernel有多种写法,每种写法都有不同的含义:__global__ void kernel(para);前面的前缀除了__global__之外还有__host__,__device__,__host__ and __device__这几种。__global__函数是指在CPU上调用,在GPU上执行的函数。__host__指的是在CPU上调用,在CPU中执行的,__device__指的是在GPU上调用,在GPU上执行的。
  • 把大象取出来:这和把大象塞进去是运用的同样的通道,这里就不再赘述了。
  • 如果嫌冰箱太麻烦的话(在编程中推荐这么做,因为下次再启动的时候就又有一块干净的内存了):cudaFree(pointer_onGPU)。将你一开始alloc的那些memory给释放掉。
再过两天会将最重要的GPU里面的内存以及调度问题整理成一篇博文发表,请大家关注~~

其实CUDA C的语言是很好学的,跑几个程序就能得到结果了。最重要的不是说我们要学一门语言,最重要的是学习并行计算的思路以及如何进行数据的并行化处理。将大量的计算过程拆分成很多平行处理的单元(当然,单元之间可以有相互的作用:1 block内部的thread之间可以互相交互)。这是CUDA学习的核心,也是最困难的地方。以上是我对于CUDA C语言的一些基本结构的理解。十分浅显,我也在努力的学习着。

On the way~~~

https://blog.sciencenet.cn/blog-376446-625861.html

上一篇:网络上的资料,能利用好么?
下一篇:未来的生活(小小畅想一下)
收藏 IP: 67.198.145.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-28 15:07

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部