一起学CUDA(零)
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(零)的更多相关文章
- CUDA零内存拷贝 疑问考证
今天思考了一下CUDA零内存拷贝的问题,感觉在即将设计的程序中会派上用场,于是就查了一下相关信息. 以下是一些有帮助的链接: cuda中的零拷贝用法--针对二维指针 cuda中的零拷贝用法--针对一维 ...
- 从0.5开始学Java 零
作为新世纪的码农,掌握多门语言是必须的. 我先从java学起,工作又是做c# ,现在辞职了想重新捡回java的技术,所以写一个长篇 来给自己复习 ,题目就叫做从0.5开始学java. 核心内容就是 一 ...
- 菜鸟学Struts2——零配置(Convention )
又是周末,继续Struts2的学习,之前学习了,Struts的原理,Actions以及Results,今天对对Struts的Convention Plugin进行学习,如下图: Struts Conv ...
- 一起学CUDA(一)
前提是电脑的显卡支持CUDA,N卡一般是支持的,如果是A卡就没办法了.主要针对Windows环境,Linux和Mac也有相应的安装包.CUDA环境搭建:Step1:安装代码环境VS2010:Step2 ...
- 第一个CUDA程序
开始学CUDA 先写一个简单的 #include<iostream>__global__ void add( int a, int b, int *c ) { *c = a + b;}in ...
- Cuda入门笔记
最近在学cuda ,找了好久入门的教程,感觉入门这个教程比较好,网上买的书基本都是在掌握基础后才能看懂,所以在这里记录一下.百度文库下载,所以不知道原作者是谁,向其致敬! 文章目录 1. CUDA是什 ...
- [CUDA] 00 - GPU Driver Installation & Concurrency Programming
前言 对,这是一个高大上的技术,终于要做老崔当年做过的事情了,生活很传奇. 一.主流 GPU 编程接口 1. CUDA 是英伟达公司推出的,专门针对 N 卡进行 GPU 编程的接口.文档资料很齐全,几 ...
- pytorch下的lib库 源码阅读笔记(2)
2017年11月22日00:25:54 对lib下面的TH的大致结构基本上理解了,我阅读pytorch底层代码的目的是为了知道 python层面那个_C模块是个什么东西,底层完全黑箱的话对于理解pyt ...
- 第一篇:GPU 编程技术的发展历程及现状
前言 本文通过介绍 GPU 编程技术的发展历程,让大家初步地了解 GPU 编程,走进 GPU 编程的世界. 冯诺依曼计算机架构的瓶颈 曾经,几乎所有的处理器都是以冯诺依曼计算机架构为基础的.该系统架构 ...
随机推荐
- LINUX输入输出与文件——续
1 目录操作 改变目录或文件的访问权限 #include <sys/stat.h> int chmod(const char *path, mode_t mode); //mode形如07 ...
- shell基础(一)
Shell本身是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁,用户的大部分工作都是通过Shell完成的.Shell既是一种命令语言,又是一种程序设计语言.作为命令语言,它交互式地解释 ...
- linux下如何查看主机的外网ip地址
在linux下如果我们使用的是nat方式上网.通过ifconfig命令查看到的ip地址往往是内网地址 那么如何查看主机在互联网上使用的公网IP呢?我们可以在命令行下使用curl命令实现这个功能. [r ...
- java 基本数据类型 回顾
- MSChart 控件
微软发布了.NET 3.5框架下的图表控件,功能很强劲,基本上能想到的图表都可以使用它绘制出来,给图形统计和报表图形显示提供了很好的解决办法,同时支持Web和WinForm两种方式,不过缺点也比较明显 ...
- CentOS下如何查找大文件
在Windows系统中,我们可以使用TreeSize工具查找一些大文件或文件夹,非常的方便高效,在Linux系统中,如何去搜索一些比较大的文件呢?下面我整理了一下在Linux系统中如何查找大文件或文件 ...
- [vim]vim中有中文乱码
sudo gedit /etc/vim/vimrc 在文件的最后加上 let &termencoding=&encoding set fileencodings=utf-8,gbk,u ...
- 管理IPv4网络连接
1. 使用 nmcli 检查所有连接 [root@desktop1 ~]# nmcli connection NAME UUID TYPE DEVICE eno33554960 5be7dba9-6b ...
- Solr的一些查询参数
fl: 是逗号分隔的列表,用来指定文档结果中应返回的 Field 集.默认为 “*”,指所有的字段. defType: 指定query parser,常用defType=lucene, defType ...
- git提交代码步骤
01:首先git status一下查看当前目录下修改的文件,当然编译生成的文件也在其中,我们只看自己修改的: 02:git add ****** //(文件名) 将上述查找到自己修改的文件添加到git ...