高性能计算——流水线的危害
流水线的危害
流水线允许你通过并发执行指令来隐藏指令的延迟,但也创造了一些自身的潜在障碍——特征性地称为流水线危害,即下一条指令不能在下一个时钟周期执行的情况。
这可能发生的方式有多种:
- 结构危害:发生在两条或更多指令需要CPU的同一部分(例如,一个执行单元)时。
- 数据危害:发生在你必须等待某个操作数从之前的步骤计算出来时。
- 控制危害:发生在CPU无法判断它接下来需要执行哪些指令时。
解决危害的唯一方法是进行流水线停顿:在拥塞的原因消失之前停止所有之前步骤的进展。这在流水线中创造了气泡——类似于流体管道中的气泡——一种时间传播的状态,当执行单元空闲且没有有效工作完成时。
不同的危害有不同的代价:
- 在结构危害中,你必须等待(通常是多一个周期)直到执行单元准备好。它们是性能的基本瓶颈,无法避免——你必须围绕它们进行工程设计。
- 在数据危害中,你必须等待所需数据被计算出来(关键路径的延迟)。数据危害通过重构计算来解决,以便关键路径更短。
- 在控制危害中,你通常必须清空整个流水线并重新开始,浪费整整15-20个周期。它们通过完全移除分支或使分支可预测来解决,以便CPU可以有效地推测接下来将执行什么。
由于它们对性能有非常不同的影响,我们将以相反的顺序开始,从更严重的问题开始讨论。