CUDA的一些总结和体会

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/x_shuck/article/details/51683037

导论

  • GPU怎么产生的,以及后续发生了哪些变化?
  • 实时、高清晰度的三维图形需要大量的计算,单纯的CPU无法满足这种需求。由于这种需求的推动,图形处理器(GPU)就逐渐演化成高并行度,多线程,拥有强大的计算能力和极高的存储器带宽的多核处理器。
  • GPU和CPU的浮点计算能力差异的原因是:GPU是特别为计算密集,高并行度计算(如图像渲染)设计的,因此GPU将更多的晶体管用于数据计算而不是数据缓存和流程控制。
  • 特别地,GPU非常适合处理那些能够表示为数据并行计算的(同一程序在多个数据上并行执行)的问题,数据并行计算的算术计算密度(算术操作和存储器操作的比例)非常高。
    CPU和GPU晶体管设计差异
    晶体管设计比较

  • CUDA是什么? CUDA能干什么?用CUDA有什么好处?

  • CUDA是英伟达公司推出的一种基于新的并行编程模型和指令集架构的通用计算架构,它能利用英伟达GPU的并行计算引擎,比CPU更高效的解决许多复杂计算任务。
  • 使用CUDA的好处就是透明。根据摩尔定律GPU的晶体管数量不断增多,硬件结构必然是不断的在发展变化,没有必要每次都为不同的硬件结构重新编码,而CUDA就是提供了一种可扩展的编程模型,使得已经写好的CUDA代码可以在任意数量核心的GPU上运行。如下图所示,只有运行时,系统才知道物理处理器的数量。
    CUDA的透明性示例
    CUDA的透明性示例

    CUDA编程模型

    不知道为什么CUDA的编程模型要从内核,线程层次,存储器层次,异构编程和计算能力讲起。就假设编程模型基于这几部分组合而成吧。

    • 首先是内核。内核的运行是CUDA的设计目的和优势所在。因为内核的调用会被N个CUDA线程执行N次(其实是每个线程只执行了一次)。这是和普通的C函数只执行一次的不同所在。以一维数组的加法为例:
      内核代码示例

    • 线程层次。线程层次讲究线程,块,网格。先插一下为什么要分层次,为了灵活。假设不分层次,只是用一种配置,那么很难适应不同的问题需求不同的硬件变化。层次就讲究,只用一个接口确定了,下边随便实现随便变化,都行,这就是分层的好处(由此是不是想到了网络的OSI分层模型)。为了灵活(也叫可扩展),适应不同规模的问题,把线程组织组成块,块组织成网格。一个问题,就对应与一个网格(最多三维),然后解决这个问题用到的线程的总的数量就是块数*块内线程数。举例如下:
      线程层次代码示例

    • 关于线程层次需要会熟练计算线程ID。对于大小为(Dx, Dy)的二维块来说,索引(x, y)对应的线程ID是(x+y*Dx);对于大小为(Dx, Dy, Dz)的三维块来说,索引(x, y, z)的线程ID是(x+y*Dx+z*Dx*Dy) 。

展开阅读全文

没有更多推荐了,返回首页