当前位置: 首页 > article >正文

CPU性能优化--后端优化

前面已经讨论过CPU后端组件,CPU后端低效往往被描述为这样一种场景,当前端已经完成取指令和译码后,后端发生了过载而不能处理新的指令。从技术上讲,这是一种由于后端缺少资源无法处理新的微操作而导致前端不能交付微操作的场景。例如,数据缓存未命中导致的停滞以及除法单元过载导致的停滞。

需要强调的是,只有在TMA显示高 后端绑定指标时,才需要考虑针对CPU后端进行代码优化。TMA进一步把后端绑定指标拆解为两个类别;内存绑定 和核心绑定,接下来,我们将讨论这两个类别。

8.1 内存绑定

当应用程序执行大量的内存访问并且花比较长的时间等待内存访问完成时,那么该应用程序会被表征为内存绑定。这意味着要提高程序的性能,我们可能需要改善程序的内存访问情况,减少内存访问次数或者升级内存子系统。

图45佐证了内存的分层性能非常重要这一说法。该图展示了内存和处理器的性能差距,纵轴以对数刻度显示了CPU和DRAM性能差距的增长趋势,内存基线时从1980年的64KB DRAM芯片的内存访问延迟开始的。典型的DRAM性能每年提升7%,而CPU每年提升20-50%。

在TMA中,内存绑定会统计CPU流水线由于按需加载或存储指令而阻塞的部分槽位。解决此类性能问题的第一步是,定位导致高内存绑定 指标的内存访问,识别出导致问题的具体内存访问后,就可以通过集中策略来进行优化,下面,我们将讨论几个典型的案例。

8.1.1 缓存友好的数据结构

从缓存中读取一个变量只会花费几个时钟周期,但是,如果变量不在缓存中而从RAM内存中读取的话,就会花费100多个时钟周期。关于编写缓存友好算法数据结构重要信息还有很多因为这是高性能应用程序关键要素之一编写缓存友好代码关键时间空间局部性原则目标从缓存高效读取所需要数据设计缓存友好代码缓存角度考虑很有意义不仅仅考虑单个变量他们内存位置

8.1.1.1 按顺序访问数据

利用缓存空间局部性最佳方法顺序访问内存这样做我们可以利用硬件预取识别内存访问模式提前引入下一个数据块代码清单19展示一个C代码例子实现缓存友好访问因为元素内存中排列顺序访问矩阵元素所以缓存友好如果交换数组索引顺序导致优先遍历这样没有利用空间局部性损害性能

缓存友好内存访问

for (row = 0; row < NUMROWS; row++)

for (column = 0; column < NUMCOLUMNS; column++)

matrix[row][column] = row + column;

8.1.1.2 使用适当容器

几乎在任何语言中都有各种个样现成容器了解它们底层存储机制性能影响很重要

此外还要考虑代码将如何处理数据然后才能选择数据存储方式对象很大时对象存储数组中还是存储指向这些对象指针指针数组占用内存更少有利于修改数组操作

8.1.13 打包数据

通过使用数据更紧密来提高内存层次利用率

struct S

{

unsigned a;

unsigned b;

unsigned c;

};

3 * 4个字节

struct S

{

unsigned a:4;

unsigned b:2;

unsigned c:2;

};

8.1.1.4 对齐填充

对象起始地址16字节对齐

alignas(16) int16_t a[N];

#define CACHELINE_ALIGN alignas(64)

struct CACHELINE_ALIGN S {

}

对齐可能导致未使用字节出现空位可能会降低内存带宽利用率如果上面例子中结构体S只有40BS下一个对象下一个缓存行开头开始每个保存S对象缓存行都会留下64 -40 = 24未使用字节

我们需要填充数据结构成员避免边缘情况例如缓存争用例如多线程应用程序当两个线程AB访问同一结构不同字段可能会出现共享问题

对齐注意事项中最重要一个SIMD代码 依赖编译器自东向量化开发者不需要做任何特殊的事情然而使用编译器向量化内建函数编写代码需要地址能被163264整除编译器内部头文件提供向量类型已经注释以确保进行适当对齐

__m512 *pre = new __m512[N];

8.1.1.5 动态内存分配

利用自定义malloc分配器提高效率

jemalloctcmalloc

8.1.1.6 针对内存存储层次调优代码

某些应用程序性能取决于特定缓存的大小,最著名例子使用循环分块来改进矩阵乘法思想矩阵工作区域分散成更小这样每个块都能适合L2缓存

8.1.2 显示内存预取

__builtin_prefetch手动显示添加预取指令

要使预取生效请务必提前插入预取提示确保加载在被用于计算已经缓存中也不要过早插入预期提示可能会预取那段时间用不到数据


http://www.kler.cn/a/457834.html

相关文章:

  • upload-labs关卡记录5
  • 【论文笔记】Contrastive Learning for Sign Language Recognition and Translation
  • 云计算时代携程的网络架构变迁
  • vulnhub jangow靶机
  • 《云计算能不能真正实现按需付费?》
  • unplugin-vue-router 的基本使用
  • 机器学习周报-TCN文献阅读
  • vulnhub DriftingBlues6靶机
  • C++ 设计模式:装饰模式(Decorator Pattern)
  • 如何给 Flask 项目创建 Systemd 服务 ?
  • 【Maven】属性管理
  • 基于云计算的资源管理系统
  • ModbusTCP转Profinet:工业通信的利器
  • TCP网络编程(一)—— 服务器端模式和客户端模式
  • NestJS 微服务架构:从单体到分布式
  • 【开源免费】基于SpringBoot+Vue.JS租房管理系统(JAVA毕业设计)
  • 客户案例:基于慧集通平台集成打通小满CRM+金蝶云星空+钉钉
  • 2024年数字政府服务能力优秀创新案例汇编(附下载)
  • ubuntu卸载docker
  • 闲谭Scala(2)--安装与环境配置