概念
Core Bound 指 CPU 核心计算能力受限。包括两种:
- 硬件的计算资源不足(吞吐量受限)
- port 冲突:例如 Intel Skylake 架构上,除法和平方根运算都会被分配到 port 0 上,如果大量的类似耗时操
作排队,那么就会体现为硬件算力的限制。
Port 指的是 CPU 内部的 执行端口(execution ports)。
现代 CPU(尤其是 Intel、AMD 的 x86-64 架构)采用 超标量、乱序执行,有多个功能单元可以并行执行不同
类型的指令。每个功能单元挂在一个 端口 (port) 上,负责特定类型的操作,比如:
- 整数运算端口(加减、逻辑运算)
- 浮点运算端口(乘法、除法、加法)
- 加载端口(从内存读取数据)
- 存储端口(写数据到内存)
CPU 的调度器会把指令分配到合适的端口执行。
如果某类端口资源不足,就会出现 port bound(端口受限),性能瓶颈来自于某个端口的拥塞。
👉 举例: Intel Skylake 架构有 8 个端口:
- Port 0/1:整数和浮点运算
- Port 2/3:加载(Load)
- Port 4:存储地址计算
- Port 5:存储数据
- Port 6:分支预测
- Port 7:整数运算
- 指令间的依赖(增加延迟)
例如链表的遍历,CPU 无法对其并行。
1 | while (n) { |
优化方法
第 1 种计算能力受限的问题,最好的办法是升级 CPU,换成具有更多除数的型号,或者将计算任务卸载到加速器
上。
第 2 种数据依赖链的问题,可能需要重写算法。下面介绍一些有名的优化方法:
- 向量化
- 函数 inline 化
- 循环转换
- 编译器内建函数
- 其他
目的是减少执行的指令或用更好的汇编指令替代。