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