CUDA并行计算框架(一) 概念相关、内容比较抽象

一.   概念。

1. 相关关键字。

CUDA(Compute Unified Device Architecture)。

GPU英文全称Graphic Processing Unit,中文翻译为“图形处理器”。

2. CUDA是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。它包含了CUDA指令集架构(ISA)以及GPU内部的并行计算引擎。。

3. 从CUDA体系结构的组成来说,包含了三个部分:开发库、运行期环境和驱动。开发库是基于CUDA技术所提供的应用开发库。运行期环境提供了应用开发接口和运行期组件,包括基本数据类型的定义和各类计算、类型转换、内存管理、设备访问和执行调度等函数。驱动部分基本上可以理解为是CUDA-enable的GPU的设备抽象层,提供硬件设备的抽象访问接口。

4. 应用领域例如游戏、高清视频、卫星成像等数据规模庞大的场景。

二.   初探。

1. CUDA框架

CUDA 是 NVIDIA 的 GPGPU 模型,它使用 C 语言为基础,可以直接以大多数人熟悉的C 语言,写出在显示芯片上执行的程序,而不需要去学习特定的显示芯片的指令或是特殊的结构。

在 CUDA 的架构下,一个程序分为两个部份:host 端和 device 端。Host 端是指在 CPU 上执行的部份,而 device 端则是在显示芯片上执行的部份。Device 端的程序又称为 "kernel"。通常 host 端程序会将数据准备好后,复制到显卡的内存中,再由显示芯片执行 device 端程序,完成后再由 host 端程序将结果从显卡的内存中取回。

2. Cpu与Gpu的各自领域

CPU和GPU各有所长。一般而言,CPU擅长处理不规则数据结构和不可预测的存取模式,以及递归算法、分支密集型代码和单线程程序。这类程序任务拥有复杂的指令调度、循环、分支、逻辑判断以及执行等步骤。例如,操作系统、文字处理、交互性应用的除错、通用计算、系统控制和虚拟化技术等系统软件和通用应用程序等等。而GPU擅于处理规则数据结构和可预测存取模式。例如,光影处理、3D 坐标变换、油气勘探、金融分析、医疗成像、有限元、基因分析和地理信息系统以及科学计算等方面的应用。显示芯片通常具有更大的内存带宽。具有更大量的执行单元。和高阶 CPU 相比,显卡的价格较为低廉。

目前设计GPU+CPU架构平台的指导思想是:让CPU的更多资源用于缓存,GPU的更多资源用于数据计算。把两者放在一起,不但可以减小在传输带宽上的花销,还可以让CPU和GPU这两个PC中运算速度最快的部件互为帮衬。其原因是,CPU中的运算器通常只有几个ALU,而GPU中的ALU则比CPU的数目多很多。另外,CPU中高速缓存相对比较多,而GPU中的高速缓存则比CPU少很多。必要的时候,CPU可以帮助GPU分担一部分软件渲染工作,另一方面GPU可以使用主流编程语言来处理通用计算问题。这就相当于CPU多了一个强大的浮点运算部件,而GPU多了一个像素处理单元。

从微架构上看,CPU和GPU看起来完全不是按照相同的设计思路设计的,当代CPU的微架构是按照兼顾“指令并行执行”和“数据并行运算”的思路而设计,就是要兼顾程序执行和数据运算的并行性、通用性以及它们的平衡性。CPU的微架构偏重于程序执行的效率,不会一味追求某种运算极致速度而牺牲程序执行的效率。GPU的微架构就是面向适合于矩阵类型的数值计算而设计的,大量重复设计的计算单元,这类计算可以分成众多独立的数值计算——大量数值运算的线程,而且数据之间没有像程序执行的那种逻辑关联性。

从主频上来看,GPU执行每个数值计算的速度并没有比CPU快,从目前主流CPU和GPU的主频就可以看出了,CPU的主频都超过了1GHz,2GHz,甚至3GHz,而GPU的主频最高还不到1GHz,主流的也就500~600MHz。要知道1GHz = 1000MHz。所以GPU在执行少量线程的数值计算时并不能超过CPU。

从每个时钟周期执行的指令数来看,这个方面,CPU和GPU无法比较,因为GPU大多数指令都是面向数值计算的,少量的控制指令也无法被操作系统和软件直接使用。如果比较数据指令的IPC,GPU显然要高过CPU,因为并行的原因。但是,如果比较控制指令的IPC,自然是CPU的要高的多。原因很简单,CPU着重的是指令执行的并行性。

GPU 的设计能使更多晶体管用于数据处理,而非数据缓存和流控制。

更具体地说,GPU 专用于解决可表示为数据并行计算的问题——在许多数据元素上并行执行的程序,具有极高的计算密度(数学运算与存储器运算的比率)。由于所有数据元素都执行相同的程序,因此对精密流控制的要求不高;由于在许多数据元素上运行,且具有较高的计算密度,因而可通过计算隐藏存储器访问延迟,而不必使用较大的数据缓存。

3. Gpu的线程层次结构

执行内核的每个线程都会被分配一个独特的线程 ID。线程的索引及其线程 ID 有着直接的关系:对于一维块来说,两者是相同的;对于大小为 (Dx,Dy) 的二维块来说,索引为 (x,y) 的线程的ID 是(x + yDx);对于大小为(Dx,Dy, Dz)的三维块来说,索引为(x, y, z)的线程的ID 是(x + yDx + ZDxDy)。

一个块内的线程可彼此协作,通过一些共享存储器来共享数据,并同步其执行来协调存储器访问。一个线程块最多可以包含 512 个线程。但一个内核可能由多个大小相同的线程块执行,因而线程总数应等于每个块的线程数乘以块的数量。这些块将组织为一个一维或二维线程块网格。

线程块需要独立执行:必须能够以任意顺序执行、能够并行或顺序执行。这种独立性需求允许跨任意数量的核心安排线程块,从而使程序员能够编写出可伸缩的代码。

返回栏目页:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/extra/

时间: 2024-09-15 07:26:48

CUDA并行计算框架(一) 概念相关、内容比较抽象的相关文章

CUDA并行计算框架(二) 实例相关

从这部分开始 结合虫子的demo程序给大家分析下cuda的性能与可行性. 一.先概述下实现流程. CUDA在执行的时候是让host里面的一个一个的kernel按照线程网格(Grid)的概念在显卡硬件(GPU)上执行.每一个线程网格又可以包含多个线程块(block),每一个线程块中又可以包含多个线程(thread). 每一个kernel交给每一个Grid来完成.当要执行这些任务的时候,每一个Grid又把任务分成一部分一部分的block,block再分线程来完成.每个Grid中的任务是一定的.二维线

CUDA并行计算框架(三)应用前景及相比价微软的并行计算框架

关于微软.net4.0推出的并行计算框架 还没深入了解 有兴趣的同学可以参考下http://bitfan.blog.51cto.com/907048/200199系列博文 不过发表下个人的观点 微软.NET 4.0中引入的并行扩展(包括任务并行库TPL和PLINQ)开发技术基于cpu. 从应用领域上来说CPU擅长处理不规则数据结构以及递归算法.分支密集型代码和单线程程序.这类程序任务拥有复杂的指令调度.循环.分支.逻辑判断以及执行等步骤.例如,操作系统.文字处理等,而GPU擅于处理规则数据结构.

Tiny并行计算框架之复杂示例

问题来源 非常感谢@doctorwho的问题: 假如职业介绍所来了一批生产汽车的工作,假设生产一辆汽车任务是这样的:搭好底盘.拧4个轮胎.安装发动机.安装4个座椅.再装4个车门.最后安装顶棚.之间有的任务是可以并行计算的(比如拧4个轮胎,安装发动机和安装座椅),有的任务有前置任务(比如先装好座椅,才能装车门和顶棚).让两组包工头组织两种类型的工作:将工人分成两种类型,即可并行计算的放在同一组内,由职业介绍所来控制A组包工头做完的任务交给B组包工头.中间环节的半成品保存到Warehouse中,是这

Tiny并行计算框架之实现机理

当然,秉承偶的一向的观点,让新手也能看得懂. 首先看工作的接口: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 public interface Wor

javascript实现框架高度随内容改变的方法_javascript技巧

本文实例讲述了javascript实现框架高度随内容改变的方法.分享给大家供大家参考.具体如下: 有两种方法: 一.就是通过父页面改变 这里要理解框架的两个属性 contentWindow 和contentDocument 两个属性的意思和window document意思差不多,不同的是contentWindow 所有浏览器都支持,contentDocument   ie6,7不支持,chrome 也不支持 <iframe onload="change_height()">

开源框架Tiny之内容组成

源码快照:https://git.oschina.net/tinyframework/tiny 上手之前,默认已经熟悉Maven和Git,对于Maven和Gig相关问题,女生请问谷哥,男生请问度娘,他二位的细致耐心一定会让你满意的. install之前需要进行环境准备,确认你的机器可以联得上外网,或者有好用的Maven代理. 请确认在编译环境中存在jdk1.5和1.6以上版本. 在你的Maven settings.xml中增加如下配置: 在<profiles>中添加下面的内容,注意:文件路径要

win7 64位下自行编译OpenCV2.4.10+CUDA toolkit 5.5的整个过程以及需要注意的问题(opencv+cuda并行计算元素的使用)

       首先说明的是,这个帖子是成功的编译了dll,但是这个dll使用的时候还是很容易出现各种问题的. 发现错误可能是由于系统安装了太多版本的opencv,环境变量的设置混乱,造成dll版本加载不对的问题.           更新:下面这篇文章里面有加速编译的设置办法:但是编译器采用了vs2012,我根据他的所有软件版本换了编译器,以及QT库,需要特别注意的是,这些库的相应操作系统版本32bit 或者64bit版本 QT早期版本下载地址:   下面这个网址能够找到qt的各个版本 http

Apache Hama 0.6.3 发布,并行计算框架

http://www.aliyun.com/zixun/aggregation/14417.html">Apache Hama 0.6.3 发布,该版本兼容 Hadoop 2,增加了基于 BSP 的机器学习算法.动态图形 API 等. Hama 是个计算框架,基于BSP (Bulk Synchronous Parallel大容量同步并行)计算技术,主要针 对大规模科学的计算.

【spring框架】什么是面向抽象(接口)编程

面向抽象(接口)编程的好处就是灵活性 例子: 对于一个User的JavaBean,对他进行保存. 其中有这几个包 cn.edu.hpu.model:存放实体类 cn.edu.hpu.Service:存放业务类 cn.edu.hpu.Dao:存放数据库连接类 如果要实现可以结合多个数据库的功能该怎么写比较灵活?用面向抽象的思想: UserService: package cn.edu.hpu.service; import cn.edu.hpu.dao.UserDao; import cn.edu