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

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连续存储,一次性取出;使用字符串池,利用地址来比较是否相等,减少大字符串的来回取用等。

相关推荐
打工仔折腾 AI8 分钟前
Linux 网络编程:从零掌握 TCP Socket 编程与 C++ 实战落地
linux·网络·人工智能·后端·python·tcp/ip·性能优化
打工仔折腾 AI1 小时前
深入验证 DeepSeek 新模型开源声明:KV 缓存指标与按次计费的后端落地评估
缓存·性能优化·开源·ai agent 实战
隔窗听雨眠6 小时前
开源为骨自研为魂:存储统一管理平台的混合架构实践
性能优化·实战教程·原理解析·踩坑记录
科威网络14 小时前
企业网站技术方案:响应式、SEO 结构与性能优化实践
性能优化·需求分析·软件需求
爱喝水的鱼丶14 小时前
SAP-ABAP:ECC→S/4HANA ABAP 迁移升级指南——程序改造、语法兼容与性能优化 导语
运维·开发语言·性能优化·sap·abap·经验交流·开发交流
传奇开心果编程20 小时前
【Compose Multiplatform跨端声明式UI实用技术】第17课:性能优化与基准测试
性能优化·移动开发·跨平台·编程语言理论·开发范式·编程框架·声明式ui
科威网络1 天前
APP 技术选型:原生、React Native、Flutter 怎么选?
性能优化·软件需求·web app
硅基手札1 天前
SPI技术系列 12 · SPI 设备驱动实战
linux·驱动开发·单片机·嵌入式硬件·mcu·性能优化·系统架构
ZhengEnCi1 天前
多 Agent 系统如何复用 KV 缓存-前缀对齐比缓存开关更重要
人工智能·性能优化·llm
利威尔xu1 天前
Go GMP 调度器 10 个高频追问:3 个线上故障让 P99 从 80ms 飙到 2s、10 万 goroutine 泄漏
开发语言·后端·面试·性能优化·golang