CUDA入门学习(一)

    由于项目的需要,近期开始学习CUDA。CUDA(Compute Unified Device Architecture),是显卡厂商NVIDIA推出的运算平台。 它是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。 其包含了CUDA指令集架构ISA)以及GPU内部的并行计算引擎。 开发人员现在可以使用C语言来为CUDA架构编写程序,C语言是应用最广泛的一种高级编程语言。所编写出的程序于是就可以在支持CUDA的处理器上以超高性能运行。CUDA3.0已经开始支持C++FORTRAN。之前学习过机器学习课程,对大数据集进行训练经常会花费很大的训练时间,如果利用GPU的并行计算能力,那么很多性能都能有质的飞跃。以后也许会入坑Machine Learning.所以学习CUDA应该也算是为以后做点铺垫吧。

一.A KERNEL CALL

          

          先看一个简单的例子吧!是不是很熟悉,没错!这其实就是C语言啦。只是其中多了两个新的东西,这就是CUDA C 和 C语言的一点点区别,多了一些属于自己的关键字。对于程序里面的和CUDA无关的代码来说,默认使用的编译器是C编译器,比如 GNU gcc等,而对于kernel函数它会自动识别用CUDA自带的编译器nvcc,它可以将host(CPU) 和 device(GPU) component 区分开 。在main()函数中使用的kernel<<<1,1>>>是GPU的核函数(核函数通过CPU代码调用,运行在GPU),__global__前缀是告诉编译器这个函数生成的是GPU代码而不是CPU代码,并且这段GPU代码在CPU上是全局可见的。

二.PASSING PARAMETERS

      

      让我们再来看一个稍微复杂点的例子。在这里我们对核函数增加了几个参数。我们可以传递参数到核函数里面。但是由于CPU内存和GPU内存是不同的,两者不在同一个地方,因此我们不能够直接将参数传入核函数中,需要做一些转换(注意编译器并不会识别分配的是CPU还是GPU指针,因为所有的指针都长得一模一样)。就如同C当中的malloc函数一样,可以使用cudaMalloc函数在显存中开辟内存空间,具体的函数参数可以自己查阅接口。对于内存的分配我们可以总结这几点:  

   

    接着我们可以看到cudaMemcpy()函数,其中source pointer是device pointer,也就是GPU内存中的指针,destination pointer 是host pointer,也就是CPU内存指针,我们可以看到函数最后一个参数cudaMemcpyDeviceToHost,同样的道理我们也可以使用cudaMemcpyHostToDevice来表明相反的情况。最后通过cudaMalloc()分配的内存空间需由cudaFree()来释放,切记不可用C中的free()来释放。

三.QUERYING AND USING DEVICES

      当我们要查询GPU有多少内存,或者GPU的性能怎么样。更进一步说,当我们的电脑有多于1个的GPU的时候我们怎么选择使用哪个GPU来出来程序呢?幸运的是,NVIDIA为我们提供了这些接口:

    1.我们可以使用cudaGetDeviceCount()函数来获取GPU的数量:

    

    2.我们可以很方便的直接调用接口cudaGetDeviceProperties()来查询设备的性能以及GPU的其他信息。

    

    3.当我们需要指定设备的至少要满足的性能时我们可以使用cudaChooseDevice函数来获取设备ID,然后使用函数cudaSetDevice来设置要使用的GPU:

    

总结:

      只要你有C/C++基础学习CUDA并不会那么痛苦,最后我们以两个重要的术语结束。

     


本文参考文献:Addison.Wesley.CUDA.By.Example.Jul.2010.ISBN.0131387685


                                                                                                                                                         ——2017.6.9

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值