IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> GEA 3.4 流水线、缓存及优化 -> 正文阅读

[大数据]GEA 3.4 流水线、缓存及优化

软实时系统:即不会因为帧率而死亡,优化通常是指提升帧率

3.4.1 并行范式转移

之前CPU慢而降低CPU处理强度而提高内存处理强度
现在由于CPU具有并行能力普遍做法要使得CPU做更多的工作而避免访问内存!

3.4.2 内存缓存

处理器内含有内存缓存相较于主内存材料更贵并且更靠近核心速度更快 但也受限于大小和材料容量小很多
内存缓存中通常保存最常使用的数据块 若CPU请求的数据已经存在于内存中称为缓存命中否则称为命中失败 命中失败会带来更高的消耗

3.4.2.1 缓存线

为了降低命中失败所带来的后果通常读入更大连续内存块来保证接下来有更高的几率进行缓存命中
缓存的地址与主内存的地址存在一对多的关系
用主地址模除以缓存地址的模来得到缓存索引。缓存只能以缓存线为单位寻址。
以下内容我没有理解 摘抄下来以后有缘再见 关于主内存 缓存 内存线的问题
缓存只能处理与缓存栈大小倍数对齐的内存地址。因此,缓存实际上只能以缓存线为地址寻址,而非以字节为单位。我们考虑缓存的总大小为 2^{M} 字节,而内存线大小为 2^{n} 。我们可以用以下方法转换主内存地方至缓存线指引。首先我们去掉主内存地址的n个最低有效位,从而把字节单位转换成缓存线索引(即把地址除以2^ {n})。然后把地址分割为两部分:M-n个最低有效位为缓存索引,而余下的位告诉我们这缓存线来自哪一块内存。块索引是以一个称为旁路转换缓存(TLB)的特殊数据结构存储在缓存控制器中的。没有TLB的话。我们便无法追踪缓存索引与其他主内存地址之间的一对多关系。
现在理解了,要凭借着图像来抽象理解。

3.4.2.2 指令缓存和数据缓存

指令缓存预载即将执行的机器码,数据缓存加速从主内存上读写数据。
大多数CPU会分开这两种缓存

3.4.2.3 组关联和替换策略

缓存线与主内存地址的简单映射称为直接映射缓存。
但是如果命中失败对于已经填充了的缓存内存需要进行逐出数据的操作。
直接映射可能因为来回逐出数据而导致异常,因此现在采用两路组关联或者n路组关联也就是一块主RAM对应多块缓存内存。当发生应该逐出的时候由CPU决定逐出哪路保留哪路,常见的操作是逐出老的一路而保存新的一路。

3.4.2.4 写入策列

透写式:直接写入主内存。
回写式:先写到缓存中再合适的时候写回内存。例如程序明确清除缓存的时候。

3.4.2.5 多级缓存

在其他条件不变的情况下命中率越高程序运行的越好。缓存越大命中率越好,但因为大了之后就离得cpu远了会导致速度变慢。
多数游戏机至少采用两级缓存。先在L1找数据找不到了再尝试更大但是更慢的二级缓存。
有的PC甚至支持三级缓存。

3.4.2.6 缓存一致性:MESI和MOESI

当多个CPU核心共享单个主内存时事情变得复杂,系统必须维持缓存一致性。保证运行时程序不能展现出缓存中的内容是不同步的。

3.4.2.7 避免缓存命中失败(干货)

使用以下的经验法则可以尽量避免缓存命中失败。

  • 高效能代码的体积越小越好,体积以机器码指令数目位单位。(编译器和连接器回复测吧函数至于连续内存中)
  • 在性能关键的代码段落中,避免调用函数。
  • 若要调用函数要把函数放在最接近调用函数的地方,最好是紧接调用函数的前后,而不要把函数至于另一个翻译单元(因为这样会完全无法控制函数的距离)
  • 谨慎地使用内联函数。内敛小型函数能增进效能。然而,过多的内联会增大代码体积,使性能关键代码再不能完全装进缓存。假设有一个处理大量数据的紧凑循环,若循环时的代码不能完全装进缓存,每个循环迭代便会产生两次指令缓存命中失败。遇到这种情况,最好重新思考算法及其代码实现。

原理是?

  • 单个函数的机器码几乎总是至于连续的内存中。绝大多数的情况下链接器不会把一个函数切开,并在中间防止另一个函数(内联函数除外)
  • 编译器和链接器按函数在翻译单元源代码中的出现次序排序内存布局

3.4.3 指令流水线及超纯量CPU

指令流水线:流水线的第一个阶段结束后就尽快传送新的指令到流水线。保证CPU各部分都在忙碌的工作着。最慢的一个部分决定流水线的带宽也就是吞吐量。流水线的延迟指的是完成一个指令所需要的时间。超纯量处理器包含多组冗杂的电路使得CPU并行处理多个指令

3.4.3.1 数据依赖及流水线停顿

如果一个流水线的后一部分需要等待前一部分完成指令 这个停顿就叫流水线停顿。丰富功能的CPU会把后续不依赖之前过程功能的质量填充进停顿期来同时执行。

3.4.3.2 分支预测

调用if的时候在完成if的函数时候CPU会自动预测一个分支前进。最简单的预测方法是总是选择反向的分支,而不是选择向前的分支。高品质的CPU自带分支预测组件 类似大数据统计? 提高精确性

3.4.3.3 load-hit-store

在powerPC上常见类似XBOX360和PS3 这里先挖坑跳过以后回来再看暂时不做主机

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-01-25 10:39:53  更:2022-01-25 10:42:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 13:31:36-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码