应用瓶颈解决:微架构优化全解析
立即解锁
发布时间: 2025-08-21 02:07:55 阅读量: 2 订阅数: 4 


高性能计算系统优化与应用设计
### 应用瓶颈解决:微架构优化全解析
在计算机系统中,应用程序的性能往往受到微架构层面多种因素的制约。下面我们将深入探讨这些因素以及相应的优化策略。
#### 1. 循环与汇编指令
考虑一个对 100 以内所有数字求和的循环:
```c
for(i=0;i<100;i++)
s=s+i;
```
在汇编语言中,它会被转换为比较和条件跳转指令:
```asm
mov eax, 0x0 # set the counter variable to zero
loop1: # a marker, translated into a position by the assembler
add ebx, eax # this is the loop body
inc eax # increment the loop counter
cmp eax, 0x64 # compare if we have reached the upper limit
jle <loop1> # if the comparison yields less or equal, jump to loop1
```
由于比较结果未及时可得,流水线无法可靠执行跳转,会一直停滞直到比较结果写回。这种控制冲突部分可通过分支预测解决。
#### 2. 结构冲突
当指令流的某一部分需要的硬件功能超出可用范围时,就会出现结构冲突。例如,只有四个寄存器,而两条指令各使用两个寄存器来复制数据,若这两条指令在流水线中执行,需要其中一个寄存器的指令就得等待资源释放。
#### 3. 乱序执行与顺序执行
顺序执行时,若指令 `inst1` 存在真实依赖,需等待之前计算结果,即使后续指令 `inst2` 的依赖条件已满足,也因要保证指令顺序以产生一致结果而无法执行。而乱序执行流水线则可记录指令顺序,在写回阶段结果显现前重新排序,让 `inst2` 在 `inst1` 等待时绕过执行。
乱序执行流水线引入了两个额外阶段:
- **调度或保留站**:检查指令流的数据依赖关系,记录顺序并将指令投入执行。
- **退休阶段**:执行后重新排序指令,并按原始执行顺序将结果提交到寄存器。
#### 4. 超标量流水线
有了乱序执行,提高性能的直接方法是并行执行微指令,在两个或更多独立流水线中进行,执行完成后由退休缓冲区处理各流水线间的正确排序。不过,这种方法的并行程度受指令流固有并行性限制。
#### 5. SIMD 执行
实际中,常对大型数据集的每个元素应用相同指令,这带来了额外的并行性。潜在加速比与可并行处理的数据元素数量成正比。硬件上通过提供足够宽的寄存器实现,但这限制了向量长度。
当前英特尔 CPU 支持三种向量扩展:
| 扩展类型 | 位宽 |
| ---- | ---- |
| 多媒体扩展(MMX) | 64 位 |
| 流式 SIMD 扩展(SSE) | 128 位 |
| 高级向量扩展(AVX) | 256 位 |
#### 6. 推测执行:分支预测
流水线性能的限制因素之一是分支的存在,分支分为条件分支和无条件分支。条件分支用于运行时决策,无条件分支用于子程序、函数和函数指针调用。
当条件分支出现在指令流中,流水线会停滞,直到条件计算完成并获取下一条指令,这对性能影响较大。为缓解此问题,处理器可预测分支目标,继续向流水线提供该点的指令。处理器有分支目标缓冲区,存储该点的最后分支目标及预测成功信息。
分支预测方案分为动态预测和静态预测:
- **动态预测**:简单的实现是预测最后观察到的行为,更高级的可用两位分支预测器。
- **静态预测**:规则如下
- 向前条件分支(`if` 语句)预测为不跳转。
- 向后条件分支(循环)预测为跳转。
- 无条件分支(子程序调用或返回)预测为跳转。
分支预测失败时,处理器会执行错误代码路径,导致流水线清空,性能受严重影响。
#### 7. 内存子系统
过去十年,CPU 设计面临内存和 CPU 性能差异增大的问题。为使执行单元及时获取数据,CPU 内置了高速但小而昂贵的缓存。缓存基于局部性原理,存储主内存数据的中间副本,常存在多级缓存。
缓存实现方式有三种:
- **直接映射缓存**:每个内存地址只能存储在特定缓存行,若缓存行已占用则替换原有内容,访问延迟低但命中率低于全关联缓存。
- **全关联缓存**:缓存中同时存储数据的内存地址,查找需比较各缓存行的内存地址,命中率高但访问延迟长且成本高。
- **组关联缓存**:是前两者的折中,将缓存分为若干组,根据内存地址将缓存行放入特定组,组内全关联,成本和芯片空间合理且命中率高。
英特尔处理器核心产品系列通常有 32KB 的一级指令和数据缓存(L1)以及 256KB 的二级统一缓存(L2),均为八路
0
0
复制全文
相关推荐










