读书笔记5-处理器的微架构

处理器的微架构

一个民族有一些关注天空的人,他们才有希望。

  我们在硬件构建的世界里编写代码,在CPU的跳动声中运行代码,如果不去关心这一切是如何实现的,我们程序的效率必定会达到一个认知的瓶颈。在那时,我们自以为自己的代码已经达到完美,殊不知在那只是一个里程碑式的开始

  今天这篇文章主要谈及的是处理器的微架构的流水线作业部分:

流水线

流水的思想

  如果程序的执行被限定为逐步依次执行的话,那么提高CPU的速度无非是提升主频、加快数据传输。然而数电的知识告诉我受限于三极管的高频效应,当达到MHz级别之后,将元器件允许的频带每拓展100MHz都将是一个巨大的挑战。而流水线的引入是一个巨大的突破,将频带的拓宽不再仅仅决定于硬件本身特性,更决定硬件电路的算法,而理解流水线的工作原理对理解多线程也有很大帮助。

  借用了工厂中流水线的模型,我们把一条指令的实现分为几个步骤交给几个部件去实现(一般尽可能地分成等时长的步骤,否则可以增多执行长时间步骤的部件数量。):取指令、译码、执行(这只是一个最基本的模型)。那么指令的实现就可以如下表示:

  很显然,在等时长的理想情况下,处理速度一下子变为了以前的三倍。(IF:取指令,ID:译码,EX:执行)

  但是,等时长只是一个假设,如果(事实上也是肯定的)各个步骤长短不一,那就无法避免地会出现节拍混乱(即如前一指令EX还未执行完成,这一条EX却已经开始了)。处理器采用寄存器作为缓冲,先把此时钟周期完成的步骤的值存在寄存器中,然后再下一周期开始时才把数据传给右端节拍。这样,寄存器就像一个红绿灯一样,在同步操作中占有重要地位。

流水线的冒险

  并行虽然加快了速度,却不可避免地带来了更多的硬件上的冲突,所以也可以是达到瓶颈后必经的历练:

    结构冒险:在当前后指令需要对同一资源进行访问的时候发生。比如第一条指令的读取存储器步骤(MEM)与第四条指令的(从存储器)取指令需要对同一存储器进行访问时,就会发生冲突。

  

      这并不是程序员需要关心的,现代的硬件电路设计已经让编译器具有了智能调度的能力。

    数据冒险:在第二条指令用到了第一条指令正在修改的数据时发生。这样往往需要通过延迟一周期或者满足一定条件地直接从寄存器中加载修改后的数据。

      不得不说如果以一定次序进行编码,并且编译器采用顺序执行(而非之后要提到的乱序执行),这是无法避免的损失。另外我们并不知道一条指令会被机器拆成多少个步骤,当然如果能降低毗邻代码的耦合度,则能对所硬件平台都能避免数据冒险的发生。

    控制冒险:在跳转语句时发生。因为站在汇编语言的角度,一旦发生跳转,几条正在装载的语句的步骤都失去了意义,根据不同的硬件平台,消除这些加载的数据都会降低一定的效率。而当循环次数很多的时候,效率的降低将是非常明显的。

      然而这也不是程序员需要操作的事情(只是为了之后的理解),因为硬件逻辑在很大程度上规避了这样的问题。通过之后提到的,记录以往发生跳转的记录对此次跳转位置进行记录,然后从预测点开始预加载步骤,这样就不会浪费资源,而在追求功耗的DSP中会讲工作交给程序员。

从顺序到乱序

  因为硬件上的限制,访问内存的速度是很慢的(当然还有一些其他的耗时间的操作,这只是一个例子)虽然一些编译器能够智能地根据数据的使用频率将数据加载到不同级别的缓存当中,然而仍可以充分地利用等待读取数据的时间:优先进行不依赖于正在被读取的数据的指令。

  首先需要知道如何判定是否相互依赖呢?应该找到两条指令发生依赖关系原因,而它们往往是以下两点(从汇编语言的角度):

    1、寄存器相关

      在指令中用到了相同的寄存器,事实上它们并不一定有相关性,有可能只是因为可见的寄存器太少了。

    2、控制相关

      程序中的条件跳转指令影响到了程序的走向。如紧跟在CMP指令后的JNZ指令。这里的优化主要是编译器的工作,可以根据以往的经历对未来的跳转位置进行预测。

  以上两点提醒我以后编写对效率要求很高的程序时:

    1)尽量去除数据相关。例如:

x = a + b;

y = x + c;

z = y + d;

      可以改写为:

x = a + b;

y = c + d;

z = x + y;

    2)尽量去除实际并不相关的相关。例如:

      

C=A+B;
F=D+E;

      本来是不相关的,但是由于用户可见的寄存器太少了,变量会映射到同一个寄存器上,它们就像伪军一样是可以争取的对象,具体方法是通过对每条指令的目的寄存器映射到新的物理寄存器来解除依赖关系。(当然这样费神的工作也只有核心程序值得这样付出了)。

总结与思考

   有人说程序=算法+数据结构,然而我想这句话只适合很久的处理器结构,我想应该改写为程序=算法+数据结构+底层优化。

   我们的客户的耐心越来越少,而节约服务器的耗费也是一个让人信服的理由,现在的电脑大多都是多核,在设计、编程时面向多线程进行开发能节省得更多,而这往往是一些细节,如果了解一些CPU的实现,在实现时也将多一份方向。另外在一些核心程序遇到瓶颈时(因为编译器的优化也不是绝对智能的),可以试着查看汇编源码,甚至可以针对程序所运行的机器对变量做一些调度(当然这也往往是在商业级的服务器中)。

    

  

原文地址:https://www.cnblogs.com/Trinidad/p/8724105.html

时间: 2024-11-23 17:05:59

读书笔记5-处理器的微架构的相关文章

读书笔记2大型网站的架构模式

? 一.分层 最常见的架构模式,将系统在横向维度上切分成几个部分,每个部分单一职责.网站一般分为三个层次:应用层.服务层和数据层,其具体结构如下图所示: 通过分层,一个庞大系统切分成不同部分,便于分工合作和维护. 但是,分层架构也有一些挑战:①必须合理规划层次边界和接口:②禁止跨层次的调用及逆向调用. 二.分割 分割是在纵向方面对软件进行切分->将不同的功能和服务分割开来,包装成高内聚低耦合的模块单元,有助于软件开发和维护,还便于不同模块的分布式部署,提高网站的并发处理能力和功能扩展能力. 三.

《大型网站技术架构》读书笔记二:大型网站架构模式

一.分层 最常见的架构模式,将系统在横向维度上切分成几个部分,每个部分单一职责.网站一般分为三个层次:应用层.服务层和数据层,其具体结构如下图所示: 通过分层,一个庞大系统切分成不同部分,便于分工合作和维护. 但是,分层架构也有一些挑战:①必须合理规划层次边界和接口:②禁止跨层次的调用及逆向调用. 二.分割 分割是在纵向方面对软件进行切分->将不同的功能和服务分割开来,包装成高内聚低耦合的模块单元,有助于软件开发和维护,还便于不同模块的分布式部署,提高网站的并发处理能力和功能扩展能力. 三.分布

《大型网站技术架构》读书笔记一:大型网站架构演化

一.大型网站系统特点 (1)高并发.大流量:PV量巨大 (2)高可用:7*24小时不间断服务 (3)海量数据:文件数目分分钟xxTB (4)用户分布广泛,网络情况复杂:网络运营商 (5)安全环境恶劣:黑客的攻击 (6)需求快速变更,发布频繁:快速适应市场,满足用户需求 (7)渐进式发展:慢慢地运营出大型网站 二.大型网站架构演化过程 (1)初始阶段网站架构:一台Server就刚需-应用程序.数据库.文件等所有资源都集中在一台Server上,典型案例:基于LAMP架构的PHP网站 (2)应用和数据

读书笔记8网站的安全架构

一.网站应用攻击与防御 二.信息加密技术与密钥安全 三.信息过滤与反垃圾 四.电子商务风险控制 五.学习总结 转眼之间,<大型网站技术架构>的读书笔记到此就结束了.最近时间非常紧,因此本篇没有详细对笔记进行介绍(本篇涉及太多内容,而且都是安全相关的).通过本书的学习,我们从高性能.高可用.伸缩性.可扩展性.安全性五个方面的架构学习了每个方面经典的技术方案,虽然以理论偏多,但还是可以从中管中窥豹,一览大型网站技术的面貌.后面,等我找完工作,拿到offer后,也许会抽出时间去实践下大型网站所使用的

读书笔记-基于IP的物联网架构技术与应用

最近在看<基于IP的物联网架构,技术与应用>这边书,将自己的读书笔记,记录于此. 一.什么是智能物件? 定义:智能物件是装备了传感器,微处理器,通信装置和电源的设备. 重要属性:与现实世界的交互 和 通信能力 面临挑战: 节点级挑战:能耗.体积大小.成本.资源限制,电源效率,计算能力 网络级挑战:规模大数据量多,网络大小影响(smart object networks)的路由协议设计.路由可以集中生成,即由一个中央服务器为整个网络计算路由图,也可以是分布式的,即每个节点独立决定每条消息发送到哪

《高性能MySQL》读书笔记--MySQL逻辑架构

一.MySQL逻辑架构 MySQL最重要的.最与从不同的特性是它的存储引擎架构,这种构架的设计将查询处理及其它系统任务和数据的存储/提取相分离. 第一层,服务层,最上层的服务并不是MySQL独有的,大多数基于网络的客户端/服务端的工具或者服务都有类似的架构.主要为请求做连接处理,授权认证,安全等. 第二层,核心层,大多数MySQL的核心服务功能都在这一层,包括查询解析,分析,优化,缓存,以及所有的内置函数(例如日期.时间.数学和加密函数),所有跨存储引擎的功能都在这一层实现:存储过程,触发器,视

《深入理解bootstrap》读书笔记:第二章 整体架构

一.  整体架构 1. CSS-12栅格系统 把网页宽度均分为12等分(保留15位精度)——这是bootstrap的核心功能. 2.基础布局组件 包括排版.按钮.表格.布局.表单等等. 3.jQuery bootstrap插件的基础 4.响应式设计 兼容多个终端.这是bootstrap的终极理念. 5.css插件 提供丰富的样式. 6.js插件 二. 栅格系统 1.基本实现过程 定义容器的大小——跳转边距——媒询 有以下要求: (1)一行(row)数据必须包含在.container中. .con

C Primer Plus读书笔记-预处理器指令

代码中经常看到  #define ,#ifdef #define :明显常量 一般的指令长度仅限与一行代码,除了\(反斜杠线)可以拓展到下一行外. 一般情况下,每个#define行由三个部分组成. 第一部分为#define 指令本身 第二部分为所选择的缩略语,这些缩略语称为宏(macro).  宏的名字中不允许有空格!只能使用字母,下划线(_),和数字之间的组合,第一个字符不能为数字 第三部分(#define行除了第一第二部分外的部分).称为替换列表或主体. 预处理器在程序中发现宏的实例后,总会

读书笔记3大型网站的架构要素

? 一.大型网站的架构要素 1.性能(体现性能的多个方面 响应时间,TPS,系统性能计算器等.) 2.可用性 3.伸缩性(对于应用服务器,只要服务器上不保存数据,所有服务器都是对等的,无状态性.关系性数据库,通过路由分区等手段实现) 4.扩展性 5.安全性 ? 二.性能-响应时间决定用户 (1)浏览器端: ①浏览器缓存: ②使用页面压缩: ? ?PS:Gzip压缩效率非常高,通常可以达到70%的压缩率,也就是说,如果你的网页有30K,压缩之后就变成了9K左右.想要启用Gzip压缩,提高浏览速度,

读书笔记6网站的伸缩性架构

首先,所谓网站的伸缩性,指不需要改变网站的软硬件设计,仅仅通过改变部署的服务器数量就可以扩大或者缩小网站的服务处理能力.在整个互联网行业的发展渐进演化中,最重要的技术就是服务器集群,通过不断地向集群中添加服务器来增强整个集群的处理能力. 一.网站架构的伸缩性设计 1.1 不同功能进行物理分离实现伸缩 (1)纵向分离:将业务处理流程上得不同部分分离部署,实现系统的伸缩性: (2)横向分离:将不同的业务模块分离部署,实现系统的伸缩性:单一功能通过集群实现伸缩,多台机器部署相同的功能 1.2 单一功通