从单节点到多节点-计算性能优化的思考

0.简介

本文用于介绍近期关于性能优化的一些思考,主要在于如何高效进行多节点并行计算的优化,以及单节点如何利用现代的CPU特点和缓存特点高效的去执行计算。

1.多节点优化

多节点计算优化可以考虑两点:一是如何高效协调各节点,可以通过生成合适的分布式执行计划,尽可能让多的节点参与计算,同时采用合理的分布式共识策略,减少这部分造成的延迟和等待;二是尽可能减少数据的重分布,如果不是存算分离架构应尽可能采取合理的分布策略,在计算时尽可能少的重分布(如果是存算分离理论上可以很少的进行数据重分布)。

2.单节点优化

单节点性能优化多核的话可以尽可能利用多核资源,采用多线程来进行操作,线程数可以根据线程类型来进行设置,IO密集型线程数量应多些,计算密集型可稍多于核数即可。简单估算公式如下,根据实际情况调整:

最佳线程数目 = (线程等待时间与线程CPU时间之比 + 1)* CPU数目

接下来分析cpu和缓存特点来对性能优化做分析

2.1 现代CPU运行的理解

超标量流水线和乱序执行:

CPU指令执行可以分为多个阶段(如取址、译码、取数、运算等);

1)超标量:一个cpu核可以多个控制单元,也就是说,可以有多个流水线并发执行;也就是是说如果是没有前置依赖的指令就可以被取出并发的执行。

2)流水线:一个控制单元可以同时执行多个指令,只是每个指令在不同阶段,像一个取址,一个一码,一个取数等。

从上面描述可以看出,程序需要做到以下几个方面,就能提高超标量流水线的每时钟周期的执行指令数:

1)流水线最好是不要断,这就需要尽可能少的程序分支。

2)并发指令越多越好,指令之间尽量去掉依赖就能多个流水线并发执行。

2.2 分支预测

如上所说,程序分支少,流水线效率高,但很多时候程序分支无法避免,如果将分支分类,可以分为有条件(if/switch等)和无条件的跳转(地址跳转(函数调用)/指针跳转(虚函数))。为了执行跳转指令,在得到跳转指令之前,cpu是不知道去哪取下一条指令的,流水线只能等待,为了提高效率,引入了一组寄存器,记录最近几个地址,如果执行时直接在寄存器取出,如果取错了再重新取。可以使用likely或者unlikely来去做分支的预测,处理虚函数跳转可以使用模板编程等方式来减少开销。

2.3 多级存储与数据预取

多级存储,就是在寄存器、cache或内存中,cpu取用速度相差极大,其如果程序访问数据存在线性访问的模式,cpu会主动将后续的内存块预先载入cache,这就是数据预取。如果不是线型的,也可以使用cpu提供的数据预取指令,就是Software Prefetch。

2.4 SIMD

单指令多数据流,对于计算密集型程序来说,可能经常会需要对大量不同的数据进行同样的运算。SIMD引入之前,执行流程为同样的指令重复执行,每次取一条数据进行运算。

例如有8个32位整形数据都需要进行移位运行,则由一条对32位整形数据进行移位的指令重复执行8次完成。

SIMD引入了一组大容量的寄存器,一个寄存器包含832位,可以将这8个数据按次序同时放到一个寄存器。同时,CPU新增了处理这种832位寄存器的指令,可以在一个指令周期内完成8个数据的位移运算。

SIMD资料:https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html

2.5 数据结构优化

数据结构优化其实就是如何让其符合多级存储的结构,如何能利用SIMD。比如将一些合适的数据类型的hash表key和value连续存储,一次性取出;使用字符串池,利用地址来比较是否相等,减少大字符串的来回取用等。

相关推荐
晴空了无痕21 小时前
游戏客户端架构设计与实战:从模块化到性能优化
游戏·性能优化
谢尔登21 小时前
【React】React 性能优化
前端·react.js·性能优化
我爱松子鱼21 小时前
mysql之InnoDB Buffer Pool 深度解析与性能优化
android·mysql·性能优化
weixin_425878231 天前
Redis复制性能优化利器:深入解析replica-lazy-flush参数
数据库·redis·性能优化
奔跑吧邓邓子1 天前
【Python爬虫(36)】深挖多进程爬虫性能优化:从通信到负载均衡
开发语言·爬虫·python·性能优化·负载均衡·多进程
web135085886351 天前
全面指南:使用JMeter进行性能压测与性能优化(中间件压测、数据库压测、分布式集群压测、调优)
jmeter·中间件·性能优化
程序员远仔2 天前
【Vue.js 和 React.js 的主要区别是什么?】
前端·javascript·css·vue.js·react.js·性能优化·html5
敢嗣先锋3 天前
鸿蒙5.0实战案例:基于ArkUI启动冷启动过程最大连续丢帧数问题分析思路&案例
性能优化·移动开发·多线程·harmonyos·arkui·鸿蒙开发
小塵3 天前
【MySQL 优化】什么是回表?什么是索引覆盖?
后端·mysql·性能优化
拥有一颗学徒的心3 天前
鸿蒙第三方库MMKV源码学习笔记
笔记·学习·性能优化·harmonyos