在汇编指令的性能分析中,**Latency(延迟)和Throughput(吞吐量)**是两个关键指标,用于衡量指令的执行效率。它们的含义和区别如下:
1. Latency(延迟)
-
定义:
表示一条指令从开始执行到完成所需的时钟周期数。
例如,如果一条指令的延迟是3个周期,意味着从输入就绪到结果可用需要3个周期。 -
关键点:
- 依赖性场景:当后续指令依赖于当前指令的结果时,延迟直接影响性能。
; 例子:两条ADD指令,第二条依赖第一条的结果 add eax, ebx ; 延迟=1周期 add ecx, eax ; 必须在第一条完成后执行(总延迟=2周期)
- 单条指令的完成时间:反映指令的“响应速度”。
- 依赖性场景:当后续指令依赖于当前指令的结果时,延迟直接影响性能。
-
典型示例:
- Intel Skylake架构中,
MUL
(乘法)指令的延迟为3周期(32位整数)。
- Intel Skylake架构中,
2. Throughput(吞吐量)
-
定义:
表示在每个时钟周期内,CPU可以并行执行多少条相同指令(单位为指令/周期)。
例如,吞吐量为0.5意味着每2个周期可以完成1条指令;吞吐量为2则表示每个周期可完成2条指令。 -
关键点:
- 并行执行能力:反映CPU的流水线化和多发射能力。
; 例子:两条独立的ADD指令 add eax, ebx ; 吞吐量=0.5(假设) add ecx, edx ; 可与第一条并行执行(无需等待)
- 资源竞争:如果多条指令共享同一执行单元,吞吐量会受限。
- 并行执行能力:反映CPU的流水线化和多发射能力。
-
典型示例:
- Intel Skylake中,
ADD
指令的吞吐量为4/周期(即每个周期可执行4条独立的ADD)。
- Intel Skylake中,
3. 两者的区别
指标 | 关注点 | 影响场景 | 单位 |
---|---|---|---|
Latency | 单条指令的完成时间 | 指令依赖链(串行执行) | 时钟周期/指令 |
Throughput | 单位时间的指令执行量 | 并行执行(无依赖指令) | 指令/时钟周期 |
4. 实际应用中的权衡
- 高延迟、高吞吐:
某些复杂指令(如DIV
除法)延迟高,但通过流水线化可能实现较高吞吐(如果指令独立)。 - 低延迟、低吞吐:
简单指令(如ADD
)延迟低,但若资源冲突(如端口争用)可能限制吞吐。
5. 示例对比
假设某架构中:
-
ADD
指令:延迟=1周期,吞吐量=2/周期。- 依赖链:
ADD A, B; ADD C, A
→ 总延迟=2周期。 - 独立指令:
ADD A, B; ADD C, D
→ 可在1周期内完成(利用吞吐量)。
- 依赖链:
-
MUL
指令:延迟=3周期,吞吐量=1/周期。- 依赖链:
MUL A, B; ADD C, A
→ 总延迟=4周期。 - 独立指令:两条
MUL
需至少3周期完成(吞吐量限制)。
- 依赖链:
6. 如何获取这些值?
- 参考CPU厂商的优化手册:
- Intel:《Intel® 64 and IA-32 Architectures Optimization Reference Manual》
- AMD:《AMD64 Architecture Programmer’s Manual》
- 第三方工具:如Agner Fog的指令表。
总结:
- Latency决定串行性能,Throughput决定并行性能。
- 优化代码时,减少依赖链(降低延迟影响)或增加指令级并行(利用高吞吐)是关键策略。