学习CUDA--硬件的简单学习

#目录
day0:硬件的简单学习
#0:写在前面的话
新年开始,一起学习了解一下CUDA的知识,做机器学习的,或者说研究机器学习深度学习算法的人如果只会用算法还是远远不够的,最好能够把一些基本的算法动手实践一下,这样对以后的算法设计,工程结构设计,代码设计都有很大帮助,千万不能做“小学生玩原子弹”的事。
#1:处理器结构初步知识
介绍CUDA之前先来下学习处理器结构,当然只是简单的介绍
##1.0:CPU

这是一个典型的现代处理器结构示意图,其中包括处理器核心,就是我们平时所说的“核”,一级缓存,二级缓存,三级缓存。处理器核是用来完成计算的关键部分,简单的可以比喻成一个工人,所有计算(包括数字,逻辑等计算)都必须由工人完成,而工人需要知道工作内容和工作原料,这就是指令和数据,指令和数据存在哪?平时不用的时候放在硬盘里,当然,他们看起来就0101010101001000....这样的二进制文件,当要用他们的时候他们被读到内存-DRAM里面,当工人们需要这些数据或指令的时候,会现在自己的工具箱(L1缓存)里面找,如果没在工具箱里,就去工具车里找(L2缓存),如果还没有,就要开车回维修站(L3)找工具,工具箱和工具车每个工人都有一个自己的,并且互相隔离,但是维修站大家共享,如果L3也没有,那就去工厂找(DRAM)吧。
这个问题就是,找工具箱里的东西可能几秒钟,去工具车估计就要走几分钟,回维修站就要以小时计算了,去工厂可能就要按天计算了,这个工作效率是不能忍受的,所以这也是当年没有缓存的时候计算速度瓶颈之一,因为相比于寄存器,DRAM的速度慢的不可忍受,于是有了高速缓存的出现。
这也有一些关于带宽的知识,在后面介绍。
但高速缓存的出现也涉及很多技术上的问题,比如内存的同步,缓存数据替换算法等,但缓存能够提速的根本原因是程序的“局部性原则”。

上图为Nehalem处理器芯片内的布局。
##1.1多点计算(计算集群)
集群层次最典型的结构如下:

处理器节点,通过互联网连接多台计算机,将任务分割至各个计算节点,通过互联网交换计算结果,完成大规模并行任务。
##1.2GPU
介绍GPU结构之前,先来看IBM的Cell处理器芯片布局,因为他和现在的GPU相似度非常高:

power PC Core相当于一个管理员,他把任务分配给不同SPE,每个SPE相当于一个工人,这个图里有8个SPE,每个SPE都有自己的工具箱他们协同完成一项或者多项串行或并行任务,同时片内也有L2缓存。
Cell可以完成一个串行工作,以流水线的模式:

这个结构和NVIDIA的G80类似的;
GPU(多GPU)经典的结构:

包括SM(处理器簇)L1,L2缓存(更详细的结构预计在第三天给出简介),多个GPU之间通过PCI-E总线连接,相比于上面的计算机群的网络通信,PCI-E的数据传输速度是非常快速的。
而每个GPU内又能完成大规模的并行,因为GPU内部有大规模的用于计算的“核”(SP)。
##1.3异构计算
异构计算简单理解就是通过不同的结构完成计算,比如CPU+GPU,CPU+FPGA,ARM+DSP等多种类型的计算单元组合,有些适合做控制,有些用于做计算,各自发挥自己的所长,完成高速计算,而ARM+DSP或者ARM+FPGA多封装在一个片子里,GPU则是通过PCI-E连接在外部,更像是一个外挂设备,或者叫做协处理器,从外观看也更像计算机群的结构。
#处理器的能力
处理器的能力主要局限于:计算能力,控制能力和数据吞吐量(带宽)。
计算能力:主要参数是处理器时钟周期,和单个指令需要的周期,例如一个工人A能完成工作1,用1个步骤,而另一个工人B能完成工作1,用2个步骤,但是A一个步骤用1秒,但B一个步骤是0.5秒,那么他们的工作效率是一致的,所以对于同一个工作,步骤越少同时完成一个步骤时间越短的处理器计算能力越强。而且工人越多完成的工作也会越多越快。
控制能力:这个主要是分支预测等数据传输控制算法的设计和结构设计。
数据吞吐量:从内存读取数据到运算核心的过程类似于货车运货,货车的速度和马路的宽度。
I7 Nehalem处理器带宽,理论带宽和单核带宽

这些要素都要协调同步,一个最简单的短板效应。哪一个拖后腿都不行。
有些程序是“内存受限性”而有些程序是“处理器时钟周期或负载受限型”。
#CPU vs GPU
CPU是传统的计算的处理器,拥有复杂的指令控制体系,而GPU则是依靠大量的简单计算核心完成大规模并行计算的处理器,能够在有些计算密集型程序中发挥重要作用,也是计算机视觉,机器学习的重要工具。
学习CUDA--硬件的简单学习的更多相关文章
- jQuery学习笔记 .addClass()/.removeClass()简单学习
使用jQuery或javaScript来动态改变页面中某个或部分元素的样式,为了实现这样的功能,我们往往都是使用jQuery或javaScript来控制HTML中DOM的类名(class)从而实现增加 ...
- JAVA学习Swing绝对局部简单学习
package com.swing; import java.awt.Container; import javax.swing.JButton; import javax.swing.JFrame; ...
- Log4j简单学习笔记
log4j结构图: 结构图展现出了log4j的主结构.logger:表示记录器,即数据来源:appender:输出源,即输出方式(如:控制台.文件...)layout:输出布局 Logger机滤器:常 ...
- phpunit测试学习 1:一点简单的扼要有用的东西的总结 一点入门认识
16:45 2015/12/8phpunit测试学习 1:一点简单的扼要有用的东西的总结 一点入门认识 具体的入门安装和入门实践请参照文中的推荐博客或网上其他博客推荐博客,我感觉这几篇博客写得很不错 ...
- Quartz定时任务学习(一)简单任务
学习quartz首先了解三个概念: 调度器:负责调度作业和触发器: 触发器:设置作业执行的时间.参数.条件等:(简单触发器和Cron触发器) 作业:定时任务内容,被执行的程序: 下载必要的jar包,直 ...
- Swift学习之函数和简单地控件的创建
今天还是重复昨天做的事情--敲代码,但唯一的不同就是所学的知识不同了,我们又进一步往深得层次学习了,感觉越来越有意思了,虽然临近结束了看着大家积极性越来越低了,但是我知道我不能这样,我要比别人付出的 ...
- shiro简单学习的简单总结
权限和我有很大渊源. 培训时候的最后一个项目是OA,权限那块却不知如何入手,最后以不是我写的那个模块应付面试. 最开始的是使用session装载用户登录信息,使用简单权限拦截器做到权限控制,利用资源文 ...
- [转]ZooKeeper学习第一期---Zookeeper简单介绍
ZooKeeper学习第一期---Zookeeper简单介绍 http://www.cnblogs.com/sunddenly/p/4033574.html 一.分布式协调技术 在给大家介绍ZooKe ...
- Spring MVC 学习笔记10 —— 实现简单的用户管理(4.3)用户登录显示全局异常信息
</pre>Spring MVC 学习笔记10 -- 实现简单的用户管理(4.3)用户登录--显示全局异常信息<p></p><p></p>& ...
随机推荐
- 如何使用加多宝(jdb)在linux下调试Java程序
毕业时写了一段时间的C,那时候调试使用gdb,后来转了java,当时就想java程序怎么调试,找了一下,果然,那就是jdk自带的jdb windows里是这样的 Linux下是这样的 一般我在linu ...
- 最全最新java面试题系列全家桶(带答案)
最全最新java面试题系列全家桶(带答案) 置顶 2019年04月06日 22:40:28 青春季风暴 阅读数 14082 文章标签: java面试题技术栈 更多 分类专栏: 面试 版权声明:本文 ...
- 项目实践 hrm项目的设计过程
人事管理系统的设计过程 一.数据库表和持久化类 1.1 进行需求分析,根据功能模块设计数据库表 1.2 设计持久化实体 面向对象分析,即根据系统需求提取出应用中的对象,将这些对象抽象成类,再抽 ...
- Ubuntu12.04+Caffe (+OpenCV+CPU-only)
经过一天的努力发现12.04 的pcre的库太低了, 要解决这个bug只能升级系统到16.04 麻蛋!!! 1. 下载大神MTCNN 源码,内含caffe https://github.co ...
- javascript头像上传
上传头像: 相关关键词:ondragover(拖动元素在投放区内移动) ondrop (元素放在投放区触发但是要去处理浏览器默认事件的影响:ondragenter.ondragover) dataTr ...
- 用php连接数据库,并执行数据库操作
1,建立与数据库之间的连接 (能通过php代码执行一个SQL语句得到查询的结果) <?php mysqli_connect(' , 'demo01'); 这里要注意两个问题: ①mysqli 是 ...
- Linux 下vim命令详解
原博文:https://www.cnblogs.com/zknublx/p/6058679.html 高级一些的编辑器,都会包含宏功能,vim当然不能缺少了,在vim中使用宏是非常方便的: :qx ...
- 注解【Annotation】、反射
注解:Annotation是从JDK5.0开始引入的新技术.Annotation的作用:如果没有注解信息处理流程,则注解毫无意义)- 不是程序本身,可以对程序作出解释.(这一点,跟注释没什么区别)- ...
- Java 基本的数据类型(8种)
1.Java 基本的数据类型(8种) 整型:byte .short .int .long 浮点型:float .double 字符型:char 布尔型:boolean
- 天线basic
1.实际应用时,按内置天线还是外置天线考虑. 内置时,净空区在 PCB 上所有层(all layer) 不能放置元件,走线和铺 GND 天线远离金属,至少要距离周围有较高的元器件 10 毫米以上: ...