mthoutai

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

原创作品,出自 “晓风残月xj” 博客,欢迎转载。转载时请务必注明出处(http://blog.csdn.net/xiaofengcanyuexj)。

因为各种原因。可能存在诸多不足,欢迎斧正!

一、CUDA概念

     CUDA,英文全名Compute Unified Device Architecture,中文名统一计算设备架构。是一种革命性的并行计算架构。它同一时候支持硬件和软件的技术。统一了 GPU 的通用计算编程模式。同一时候引入的共享存储器。提高计算速度。

CUDA 不须要借助图形学 API,而是採用了类 C 语言进行开发。

同一时候,CUDA 採用了统一处理架构。减少了编程的难度,这使得CUDA 架构更加适合进行 GPU 通用计算。这里所说的GPU,GPU (Graphic Processing Unit) 是图形处理单元的简称。最早用于图形渲染。我们知道图形处理对计算性能要求是比較高的。GPU本来是用来进行图形处理的高性能并行处理器。因为他的并行计算性能。开发人员尝试对其的硬、软件进行改进。使得GPU 的可编程能力逐步提高,GPU 通用计算应运而生。

因为 GPU 具有比 CPU更为强大的计算性能。为科学计算的应用提供了新的选择。

上图能够看GPU相比CPU有很多其它的处理单元。



二、CUDA 架构
   以下这幅图CUDA的整体结构:
 
1.软件层面
CUDA 软件堆栈由下面几层组成:
A、硬件驱动程序
B、应用程序编程接口(API)和它的Runtime

C、二个高级的通用数学库(CUFFT 和CUBLAS)


当中A属于驱动层的API,B和C属于执行层的API,执行层 API 是建立在驱动层API之上的。是对驱动层 API 的封装和扩展。

这就像纯C++和STL的关系一样。纯C++是STL的底层实现。


2.硬件层面


   sp:streaming processor。底层最主要的处理单元。全部指令和任务终于都是在sp上处理的。GPU并行计算的本质就是多个同样功能部件sp同一时候处理;
   sm:streaming multiprocessor,多个sp加上其它相关资源组成一个sm,这里的其它资源特指存储资源:共享内存、寄储器等。
   warp:GPU运行程序时的调度单位,眼下CUDA的warp的大小为32,同在一个warp的线程。以不同数据资源运行同样的指令;

   grid、block、thread:在利用CUDA进行编程时。一个grid分为多个block,而一个block分为多个thread。

例如以下图:


   一个sm仅仅会运行一个block里的warp,当该block里warp运行完才会运行其它block里的warp。

进行划分时。最好保证每一个block里的warp比較合理,这样能够使一个sm交替运行里面的warp,好比多体交叉存储器能够在一定程度上做到并行,从而提高计算效率,此外。在分配block时,要依据GPU的sm个数,合理分配的block数。让GPU的sm都利用起来,提高设备利用率。分配时,也要考虑到同一个线程block的资源分配问题,不要出现资源相关等问题。

三、CUDA 编程
    CUDA专用于解决数据并行计算(同一程序在很多数据元素上并行运行)、具有高运算密度(算术运算与内存操作的比例)的问题。


1.CUDA 程序的基本模式
  * 分配内存空间和显存空间
  * 初始化内存空间
  * 将要计算的数据从内存上拷贝到显存上
  * 运行 kernel 计算
  * 将计算后显存上的数据拷贝到内存上
  * 处理拷贝到内存上的数据
CUDA 支持线程级并行,并在硬件中动态地创建、调度和执行线程。

在 CPU 中,这些操作是重量级的。可是在 CUDA 中,这些操作是轻量级的,原因在于CPU中线程并行非常大程度上是靠软件实现的,而CUDA中则主要靠硬件。硬件直接实现起来速度快、效率高。CUDA 编程模型将 CPU 作为主机(Host)。而将 GPU 做为协处理器(Coprocessor)或者设备(Device),以CPU来控制程序总体的串行逻辑和任务调度。而让GPU来执行一些可以被高度线程化的数据并行高性能计算部分。二者有机结合, GPU 与 CPU 协同工作,更确切的说是 CPU 控制 GPU 工作。GPU 在高性能计算方面有巨大的先天优势(结构决定性质。这从CUDA的硬件组成能够看出一二)。

一般而言。CUDA 并行程序也包含包含串行计算部分和并行计算部分。并行计算部分称之为内核(Kernel),内核仅仅是一个在GPU 上运行的数据并行代码段。理想情况下,串行代码的作用应该仅仅是清理上个内核函数。并启动下一个内核函数。但眼下技术遇到平瓶颈,串行计算部分仍然占领着比較大的比率,从而在一定程度上影响了CUDA的推广使用。

四、CUDA前景
    GPU正逐渐将并行计算推向主流,并行计算与异构处理器系统的“联姻”将是大势所趋,而主导这场变革的就是CUDA。随着越来越多的开发人员增加到CUDA怀抱,支持CUDA的软件将逐渐渗透到我们生活的方方面面。因为GPU的特点是处理密集型数据和并行数据计算。因此CUDA很适合须要大数据高性能并行计算的领域。眼下CUDA除了能够用C语言开发,也已经提供FORTRAN的应用接口。未来能够估计CUDA会支持C++、Java、Python等多种高级编程语言。如今CUDA技术和思想主要应用在图形动画、游戏、地质、生物、物理模拟等领域,因为GPU本身的通用特性和CUDA提供的简便高效的开发环境,我们想象CUDA大展身手的应用领域:
  ◇ 搜索引擎、文本分类等相关算法的应用
  ◇ 数据库、数据挖掘
  ◇ 电信、金融、证券数据分析
  ◇ 数理统计分析
  ◇ 生物医药project
  ◇ 图像语音识别
  这些领域的计算都是属于大规模的数据密集型计算,须要高性能、高并行的计算结构。因此我们全然有理由相信,在CUDA的驱动下。GPU可以在这些领域建立一个属于自己的新时代。



五、CUDA总结
    GPU通用计算一般指计算密集的、高并行的计算。CUDA就是基于这样的通用计算发展起来的架构;CUDA是一种革命性的并行统一计算设备架构。由一系列硬件软件技术支撑。CUDA採用C语言作为编程语言提供大量的高性能计算指令开发能力,使开发人员可以在GPU的强大计算能力的基础上建立起一种效率更高的密集数据计算解决方式。

    当下大数据理念非常火。大数据时代除了要用运用数据的思想,还要用处理数据的技术手段。CUDA的发展。为某些并行计算、具有高运算密度的大数据问题的求解提供了技术支持。


posted on 2017-05-14 09:56  mthoutai  阅读(250)  评论(0编辑  收藏  举报