GEA 3.4 流水线、缓存及优化

2024-04-17 06:08
文章标签 3.4 优化 缓存 流水线 gea

本文主要是介绍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 这里先挖坑跳过以后回来再看暂时不做主机

这篇关于GEA 3.4 流水线、缓存及优化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/910983

相关文章

java如何实现高并发场景下三级缓存的数据一致性

《java如何实现高并发场景下三级缓存的数据一致性》这篇文章主要为大家详细介绍了java如何实现高并发场景下三级缓存的数据一致性,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 下面代码是一个使用Java和Redisson实现的三级缓存服务,主要功能包括:1.缓存结构:本地缓存:使

Apache Ignite缓存基本操作实例详解

《ApacheIgnite缓存基本操作实例详解》文章介绍了ApacheIgnite中IgniteCache的基本操作,涵盖缓存获取、动态创建、销毁、原子及条件更新、异步执行,强调线程池注意事项,避免... 目录一、获取缓存实例(Getting an Instance of a Cache)示例代码:二、动态

小白也能轻松上手! 路由器设置优化指南

《小白也能轻松上手!路由器设置优化指南》在日常生活中,我们常常会遇到WiFi网速慢的问题,这主要受到三个方面的影响,首要原因是WiFi产品的配置优化不合理,其次是硬件性能的不足,以及宽带线路本身的质... 在数字化时代,网络已成为生活必需品,追剧、游戏、办公、学习都离不开稳定高速的网络。但很多人面对新路由器

MySQL深分页进行性能优化的常见方法

《MySQL深分页进行性能优化的常见方法》在Web应用中,分页查询是数据库操作中的常见需求,然而,在面对大型数据集时,深分页(deeppagination)却成为了性能优化的一个挑战,在本文中,我们将... 目录引言:深分页,真的只是“翻页慢”那么简单吗?一、背景介绍二、深分页的性能问题三、业务场景分析四、

Linux进程CPU绑定优化与实践过程

《Linux进程CPU绑定优化与实践过程》Linux支持进程绑定至特定CPU核心,通过sched_setaffinity系统调用和taskset工具实现,优化缓存效率与上下文切换,提升多核计算性能,适... 目录1. 多核处理器及并行计算概念1.1 多核处理器架构概述1.2 并行计算的含义及重要性1.3 并

MyBatisPlus如何优化千万级数据的CRUD

《MyBatisPlus如何优化千万级数据的CRUD》最近负责的一个项目,数据库表量级破千万,每次执行CRUD都像走钢丝,稍有不慎就引起数据库报警,本文就结合这个项目的实战经验,聊聊MyBatisPl... 目录背景一、MyBATis Plus 简介二、千万级数据的挑战三、优化 CRUD 的关键策略1. 查

Java实现本地缓存的常用方案介绍

《Java实现本地缓存的常用方案介绍》本地缓存的代表技术主要有HashMap,GuavaCache,Caffeine和Encahche,这篇文章主要来和大家聊聊java利用这些技术分别实现本地缓存的方... 目录本地缓存实现方式HashMapConcurrentHashMapGuava CacheCaffe

如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)

《如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)》:本文主要介绍如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)问题,具有很好的参考价值,希望对大家有所帮助,如有... 目录先在你打算存放的地方建四个文件夹更改这四个路径就可以修改默认虚拟内存分页js文件的位置接下来从高级-

PyCharm如何更改缓存位置

《PyCharm如何更改缓存位置》:本文主要介绍PyCharm如何更改缓存位置的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录PyCharm更改缓存位置1.打开PyCharm的安装编程目录2.将config、sjsystem、plugins和log的路径

JSR-107缓存规范介绍

《JSR-107缓存规范介绍》JSR是JavaSpecificationRequests的缩写,意思是Java规范提案,下面给大家介绍JSR-107缓存规范的相关知识,感兴趣的朋友一起看看吧... 目录1.什么是jsR-1072.应用调用缓存图示3.JSR-107规范使用4.Spring 缓存机制缓存是每一