我正在查找CPU绑定和IO绑定程序之间的区别。那时我遇到了answers,解释说还有其他变种,如Memory Bound,Cache bound等。
我理解Memory Bound(主内存中2个大矩阵的乘法)和IO Bound(grep)之间的差异以及CPU绑定/缓存绑定的区别。
然而,CPU绑定程序和IO绑定程序之间的区别似乎并不清楚。这是我收集的内容:
高速缓存限制 - 高速缓存访问速度是决定程序执行速度的重要因素。例如,如果程序中访问量最大的部分是一小块代码,其内部小到足以包含在缓存中,那么程序可能会被缓存限制。
CPU bound - CPU执行指令的速度是决定程序执行速度的重要因素。
但进程如何受CPU限制?我的意思是,每次都需要在执行之前(从缓存/主存储器)获取指令,因此,无论CPU有多快,它都必须等待缓存完成数据传输,因此至少会是Cache Bound或内存绑定,因为内存访问比指令执行慢。
CPU绑定与缓存绑定相同吗?
答案 0 :(得分:3)
CPU架构非常像管道,没有气味。当其中一个管道堵塞时,其他管道会溢出,而其他管道将保持空闲状态 - 这两种情况都是不好用的,但是你需要找到堵塞来释放所有东西。 同样,对于CPU,您有多个系统需要协同工作才能使程序进行。这些机器中的每一台都有可以工作的带宽上限,当它到达时 - 它将成为一个限制,使其他系统未得到充分利用甚至停滞。
例如,主存储器取决于通道的数量和DRAM的类型(当然还有频率),但我们说它通常在客户端CPU中达到25G / s的峰值。这意味着任何试图消耗超过此速率的数据的工作负载将被内存BW(即内存限制)阻塞,其余系统将未得到充分利用。
缓存BW取决于缓存级别(以及处理器微架构,当然还有缓存域的频率),但您可以在优化指南中找出它达到峰值的位置。
根据2.1.3 here,英特尔Skylake例如从L1提供2个32B负载+每个周期1个存储(尽管它们引用的实际利用率略低,可能是由于冲突或回写干扰) ,L2实际上每循环约1/2行,L3略小于1/3。这意味着如果您的数据集包含在其中一个级别中,则可以在被该缓存限制之前达到该峰值BW。
另一方面,我们假设您没有达到峰值缓存带宽,而是以较低的速率从L1消耗数据,但每个数据元素都需要许多复杂的数学运算。在这种情况下,您可能受到执行带宽的限制 - 如果这些操作仅限于部分执行端口(如某些深奥操作的情况),则更是如此。
有一些有用的工具可以确定您所依据的内容 - 例如查找TopDown analysis