首页 > 代码库 > 体系结构课程报告

体系结构课程报告

一、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大展身手的应用领域:
  ◇ 搜索引擎、文本分类等相关算法的应用
  ◇ 数据库、数据挖掘
  ◇ 电信、金融、证券数据分析
  ◇ 数理统计分析
  ◇ 生物医药工程
  ◇ 图像语音识别
  这些领域的计算都是属于大规模的数据密集型计算,需要高性能、高并行的计算结构,因此我们完全有理由相信,在CUDA的驱动下,GPU能够在这些领域建立一个属于自己的新时代。


五、CUDA总结
    GPU通用计算一般指计算密集的、高并行的计算,CUDA就是基于这种通用计算发展起来的架构;CUDA是一种革命性的并行统一计算设备架构,由一系列硬件软件技术支撑。CUDA采用C语言作为编程语言提供大量的高性能计算指令开发能力,使开发者能够在GPU的强大计算能力的基础上建立起一种效率更高的密集数据计算解决方案。
    当下大数据理念很火,大数据时代除了要用运用数据的思想,还要用处理数据的技术手段。CUDA的发展,为某些并行计算、具有高运算密度的大数据问题的求解提供了技术支持。

体系结构课程报告