1.Nvidia为什么引入CUDA
最近实验室已经有不少豪在入手本本了,因为学霸居多,所以大家一般都会说对显卡要求不高,不玩大型游戏,只是CPU不能差,Intel I7、3G的主频……

其 实现在CPU的时钟频率4GHz已经基本极限了,在这个极限点上,CPU会产生大量的热量,产生热量的原因是随着时钟频率的提升,电力功耗增大。事实上, 在电压不变的情况下,一个CPU的电力功耗大约是它时钟频率的3次方,更糟糕的是,如果CPU产生的热量增加,那么即使时钟频率不变,根据硅材质的特 点,CPU的功耗也会进一步增加,这个不断增加的无效的电能消耗,意味着你要么不能充分为处理器提供电力,要么不能够有效的冷却处理器,已经达到了电子设 备或芯片封装的散热极限,即“功耗强”(Power Wall)效应。

另一方面是市场上对更快处理器的需求,于是两个主要的PC机CPU制造商,Intel和AMD采取了多核方案,从持续的提高时钟频率转移到向处理器添加更多核的发展道路。

然 而,不管什么行业,道路的转变都是很困难的,就好比马路走惯了,突然要走水路,总会有一拨人淹死,要么就得学会游泳。多核带来的问题是,串行、单线程的问 题求解方法向多线程并行执行的问题求解方法的改变。涉及到线程的分配、内存的共享等等问题,也许你的程序在双核的电脑上跑得很欢,换个四核的机器就挂掉 了,所以这个转变一直很缓慢。其实不少人用着四核的机器运行着单线程的应用程序,顶多在一个核工作时,一些设备会动态的提升时钟频率来提高性能,所以不少 的四核机器也就是空有其表,不少的硬件资源都是浪费的。

图1:CPU和GPU的峰值性能(单位:十亿次浮点操作每秒gigaflops)

多核CPU的发展路漫漫其修远兮,另一方面,如果留意GPU和CPU的计算能力,如图1所示,GPU已经开始甩开CPU几条街了,就目前CPU很难达到 4GHz的时钟频率,核数很难超过16核,计算能力约为64gigaflops(10亿次浮点操作每秒),而如图2所示的GPU计算能力都已经远超CPU 了,如果能好好动动GPU的脑子,也许会是另一条康庄大道。

图2:当前Nvidia GPU卡性能参数

2007年,Nvidia发现了一个能使GPU进入主流的契机,即推出了CUDA(Compute Unified Device Architecture计算统一设备架构),这就为GPU增加了一个易用的编程接口,CUDA是C语言的一种扩展,它允许使用标准C来进行GPU编程, 由于CUDA的规范性以及通用易用性,近年来发展相当迅速,成为首个有可能发展成为GPU开发的候选编程语言。
2. 深入了解GPU
GPU计算能力为什么这么强,这自然跟它的内部原理是密切相关的。GPU的硬件结构与CPU的硬件结构有着根本的不同,图4显示了一个位于PCI-E总线另一侧的GPU系统。

图3:core2 系列CPU的结构图

图4:GPU卡的组成模块图
GPU的硬件部分由以下几个关键模块组成:
1)内存(全局的、常量的、共享的)
2)流处理器簇SM
3)流处理器SP
关于GPU的并发性,并发性的内涵是,对于一个特定的问题,无须考虑用哪种并行计算来求解,而只需关注求解方法中的哪些操作是可以并行执行的。由于“易并 行”不需要或者只需要少许线程间或线程块间通信,所以CUDA是很理想的并行求解平台,它用基于片上资源的、显示的通信原语来支持线程间的通信。CUDA 将问题分解成线程块的网格,每块包含多个线程,块可以按任意顺序执行,不过在某个时间点上,只有一部分块处于执行中,一旦被调度到GPU包含的N个“流处 理器簇”中的一个上执行,一个块必须从开始执行到结束,图5表示基于GPU的线程示意图。

图5:基于GPU的线程试图

附录:

相关资料可以参看书籍:

《Cuda By Example》

《CUDA PROGRAMMING:A DEVELOPER'S GUIDE TO PARALLEL COMPUTING WITH GPUs》

一起学CUDA(零)的更多相关文章

  1. CUDA零内存拷贝 疑问考证

    今天思考了一下CUDA零内存拷贝的问题,感觉在即将设计的程序中会派上用场,于是就查了一下相关信息. 以下是一些有帮助的链接: cuda中的零拷贝用法--针对二维指针 cuda中的零拷贝用法--针对一维 ...

  2. 从0.5开始学Java 零

    作为新世纪的码农,掌握多门语言是必须的. 我先从java学起,工作又是做c# ,现在辞职了想重新捡回java的技术,所以写一个长篇 来给自己复习 ,题目就叫做从0.5开始学java. 核心内容就是 一 ...

  3. 菜鸟学Struts2——零配置(Convention )

    又是周末,继续Struts2的学习,之前学习了,Struts的原理,Actions以及Results,今天对对Struts的Convention Plugin进行学习,如下图: Struts Conv ...

  4. 一起学CUDA(一)

    前提是电脑的显卡支持CUDA,N卡一般是支持的,如果是A卡就没办法了.主要针对Windows环境,Linux和Mac也有相应的安装包.CUDA环境搭建:Step1:安装代码环境VS2010:Step2 ...

  5. 第一个CUDA程序

    开始学CUDA 先写一个简单的 #include<iostream>__global__ void add( int a, int b, int *c ) { *c = a + b;}in ...

  6. Cuda入门笔记

    最近在学cuda ,找了好久入门的教程,感觉入门这个教程比较好,网上买的书基本都是在掌握基础后才能看懂,所以在这里记录一下.百度文库下载,所以不知道原作者是谁,向其致敬! 文章目录 1. CUDA是什 ...

  7. [CUDA] 00 - GPU Driver Installation & Concurrency Programming

    前言 对,这是一个高大上的技术,终于要做老崔当年做过的事情了,生活很传奇. 一.主流 GPU 编程接口 1. CUDA 是英伟达公司推出的,专门针对 N 卡进行 GPU 编程的接口.文档资料很齐全,几 ...

  8. pytorch下的lib库 源码阅读笔记(2)

    2017年11月22日00:25:54 对lib下面的TH的大致结构基本上理解了,我阅读pytorch底层代码的目的是为了知道 python层面那个_C模块是个什么东西,底层完全黑箱的话对于理解pyt ...

  9. 第一篇:GPU 编程技术的发展历程及现状

    前言 本文通过介绍 GPU 编程技术的发展历程,让大家初步地了解 GPU 编程,走进 GPU 编程的世界. 冯诺依曼计算机架构的瓶颈 曾经,几乎所有的处理器都是以冯诺依曼计算机架构为基础的.该系统架构 ...

随机推荐

  1. EF框架 完整项目记录

    今天终于能用EF框架搭建一个项目,同时能连接sqlserver 数据库.mysql 数据库 1.必须的文件 2.将必须文件导入项目,此处用到“管理 NuGet 程序包”,由于从网上下载比较慢,此处从本 ...

  2. WCF分布式开发步步为赢(10):请求应答(Request-Reply)、单向操作(One-Way)、回调操作(Call Back).

    WCF除了支持经典的请求应答(Request-Reply)模式外,还提供了什么操作调用模式,他们有什么不同以及我们如何在开发中使用这些操作调用模式.今天本节文章里会详细介绍.WCF分布式开发步步为赢( ...

  3. opencv face-detection 代码分析 (1)人脸识别后的数据

    2014,3,16   老师的工作建议如下:   1. 与四民沟通下,把openCV这边的源代码和调用接口发给四民同时抄送给我. 2. 根据openCV的实时检测结果,实现对屏幕的调整(下周一前基本实 ...

  4. Java IO(四)

    对象序列化 对象序列化又叫对象的持久化,对象的串行化(或反串行化) 当使用Serializable接口实现序列化操作时,如果一个对象中的某个属性不希望被序列化,则可以使用transient关键字进行声 ...

  5. fuel openstack 在 VirtualBox 上的部署

    搞了两天,终于搞好了.说说过程: 一开始用的6.1版本的Fuel.iso,按照国内外的教程装了几遍,但是网路验证始终不能通过.自己又不是很懂网络.后来在网上看到说6.1版的需要fuel-master连 ...

  6. lintcode:单词切分

    单词切分 给出一个字符串s和一个词典,判断字符串s是否可以被空格切分成一个或多个出现在字典中的单词. 样例 s = "lintcode" dict = ["lint&qu ...

  7. JavaPersistenceWithHibernate第二版笔记-第四章-Mapping persistent classes-003映射实体时的可选操作(<delimited-identifiers/>、PhysicalNamingStrategy、PhysicalNamingStrategyStandardImpl、、、)

    一.自定义映射的表名 1. @Entity @Table(name = "USERS") public class User implements Serializable { / ...

  8. Jackson学习笔记-对象序列化

    一.用ObjectMapper.readValue(jsonString, Student.class) , ObjectMapper.writeValueAsString(student) impo ...

  9. 编码,加解密,签名,Hash

    工作中会听到各种各样是是而非的词汇,base64,url,sha256,rsa,hash等等,你能很好的分清这些词语吗? 这次我想把它们统一的整理说明下: 一: 编码 编码是信息从一种形式或格式转换为 ...

  10. MyBatis学习总结_19_Mybatis传多个参数(三种解决方案)

    据我目前接触到的传多个参数的方案有三种. 第一种方案  DAO层的函数方法  Public User selectUser(String name,String area); 对应的Mapper.xm ...