【发布时间】:2017-04-26 07:11:26
【问题描述】:
我正在查找 CPU 绑定程序和 IO 绑定程序之间的区别。那时我遇到了answers,它解释说还有其他变体,例如内存绑定、缓存绑定等。
我了解内存绑定(主内存中 2 个大型矩阵的乘法)和 IO 绑定 (grep) 以及 CPU 绑定/缓存绑定之间的差异。
但是,CPU Bound 程序和 IO Bound 程序之间的区别似乎并不那么清楚。这是我收集的:
缓存限制 - 缓存访问速度是决定程序执行速度的重要因素。例如,如果程序中访问最多的部分是循环内的一小段代码,小到足以包含在缓存中,那么该程序可能是缓存绑定的。
CPU 限制 - CPU 执行指令的速度是决定程序执行速度的重要因素。
但是进程怎么会受 CPU 限制呢?我的意思是,每次执行前都需要(从缓存/主内存)获取指令,因此,无论 CPU 有多快,它都必须等待缓存完成数据传输,因此至少会被缓存绑定或内存绑定,因为内存访问比指令执行慢。
那么 CPU 绑定和缓存绑定一样吗?
【问题讨论】:
-
指令需要在执行前获取(从缓存/主内存)。几乎所有 CPU 都使用拆分 L1 缓存,因此指令获取不会与数据加载/存储竞争(以及其他原因)。当代码在 L1 缓存中很热时,缓存本身并不是瓶颈。获取/解码瓶颈称为“前端”瓶颈。
-
此外,指令每次运行时都需要从 L1 I-cache 中获取甚至不是真的:Intel SnB 系列 CPU 具有解码的微指令缓存和循环缓冲区,因此它们无需重新解码指令即可运行中到小循环。
-
我没有听说过缓存绑定这个词,但我认为这意味着工作集适合 L2 或 L3 缓存,但不适合 L1 缓存。因此,对于比 L1D 更大、更慢的缓存,带宽和/或延迟的代码瓶颈。可能会特别提到代码缓存瓶颈,因为这相对不寻常。
-
如果你想具体一点,有不同类型的 CPU 绑定(front-end, latency, or throughput of a specific execution port,还有分支错误预测)。这些区别可以决定超线程(或任何其他类型的 SMT)是否有用。具有大量分支错误预测或延迟瓶颈的代码可能会通过 HT 很好地扩展,因为每个线程都没有充分利用内核的执行吞吐量。
标签: performance operating-system cpu cpu-architecture cpu-cache