CUDA C语言

     前一节,我已经说了怎样在ubuntu linux上构建CUDA开发环境了,对一个语言来说,最简单的,也是用得最多的当然是它的语法了,下面我简单的介绍一下CUDA的语法。 CUDA C不是C语言,而是对C语言进行扩展。CUDA对C的扩展主要包括以下四个方面: 函数类型限定符,用来确定函数是在CPU还是在GPU上执行,以及这个函数是从CPU调用还是从GPU调用。   __device__,__device__表示从GPU上调用,在GPU上执行;   __global__,__global__表示在CPU上调用,在GPU上执行,也就是所谓的内核(kernel)函数;内核主要用来执行多线程调用。 __host__,__host__表明在CPU上调用,在CPU上执行,这是默认时的情况,也就是传统的C函数。CUDA支持__host__和__device__的联用,表示同时为主机和设备编译。此时这个函数不能出现多线程语句。   变量类型限定符,用来规定变量存储什么位置上。在传统的CPU程序上,这个任务由编译器承担。在CUDA中,不仅要使用主机端的内存,还要使用设备端的显存和GPU片上的寄存器、共享存储器和缓存。在CUDA存储器模型中,一共抽象出来了8种不同的存储器。复杂的存储器模型使得必须要使用限定符要说明变量的存储位置。  __device__,__device__表明声明的数据存放在显存中,所有的线程都可以访问,而且主机也可以通过运行时库访问; __shared__,__shared__表示数据存放在共享存储器在,只有在所在的块内的线程可以访问,其它块内的线程不能访问; __constant__,__constant__表明数据存放在常量存储器中,可以被所有的线程访问,也可以被主机通过运行时库访问; texture,texture表明其绑定的数据可以被纹理缓存加速存取,其实数据本身的存放位置并没有改变,纹理是来源于图形学的一介概念,CUDA使用它的原因一部分在于支持图形处理,另一方面也可以利用它的一些特殊功能。 如果在GPU上执行的函数内部的变量没有限定符,那表示它存放在寄存器或者本地存储器中,在寄存器中的数据只归线程所有,其它线程不可见。 如果SM的寄存器用完,那么编译器就会将本应放到寄存器中的变量放到本地存储器中。 执行配置运算符<<< >>>,用来传递内核函数的执行参数。执行配置有四个参数,第一个参数声明网格的大小,第二个参数声明块的大小,第三个参数声明动态分配的共享存储器大小,默认为0,最后一个参数声明执行的流,默认为0。 五个内建变量,用于在运行时获得网格和块的尺寸及线程索引等信息 gridDim, gridDim是一个包含三个元素x,y,z的结构体,分别表示网格在x,y,z三个方向上的尺寸,虽然其有三维,但是目前只能使用二维; blockDim, blockDim也是一个包含三个元素x,y,z的结构体,分别表示块在x,y,z三个方向上的尺寸,对应于执行配置中的第一个参数,对应于执行配置的第二个参数; blockIdx, blockIdx也是一个包含三个元素x,y,z的结构体,分别表示当前线程所在块在网格中x,y,z三个方向上的索引; threadIdx, threadIdx也是一个包含三个元素x,y,z的结构体,分别表示当前线程在其所在块中x,y,z三个方向上的索引; warpSize,warpSize表明warp的尺寸,在计算能力为1.0的设备中,这个值是24,在1.0以上的设备中,这个值是32。 其它的还有数学函数,原子函数,纹理读取、绑定函数,内建栅栏,内存fence函数等。一般而言,知道这些就应该能够写出CUDA程序了,当然要写好的话,必须知道很多其它的细节。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/23057064/viewspace-624774/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/23057064/viewspace-624774/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值