多次访问主存和乱序执行
Multiple accesses to main memory and out-of-order execution
让我们假设我有两个指向未缓存的不相关地址的指针,因此在取消引用时它们都必须从主内存中一路过来。
int load_and_add(int *pA, int *pB)
{
int a = *pA; // will most likely miss in cache
int b = *pB; // will most likely miss in cache
// ... some code that does not use a or b
int c = a + b;
return c;
}
如果乱序执行允许在计算 c
的值之前执行代码,那么在现代 Intel 上如何获取值 a
和 b
处理器?
潜在的流水线内存访问是否完全序列化,或者 CPU 的内存控制器是否执行了某种提取重叠?
换句话说,如果我们假设命中主内存需要 300 个周期。获取 a
和 b
会花费 600 个周期,还是乱序执行会导致一些可能的重叠并可能花费更少的周期?
现代 CPU 有多个加载缓冲区,因此多个加载可以同时处理。内存子系统是大量流水线的,它的许多部分的吞吐量比延迟要好得多。 (例如,通过预取,Haswell 可以每 1 个时钟(从主内存)维持 8B 负载。但是,如果提前不知道地址,则延迟为数百个周期。
所以是的,Haswell 核心可以跟踪多达 72 个等待来自缓存/内存的数据的未完成加载微指令。 (这是按内核计算的。共享的 L3 缓存还需要一些缓冲区来处理整个系统对 DRAM 和内存映射 IO 的加载/存储。)
Haswell's ReOrder Buffer size is 192 uops, so up to 190 uops of work in the code that does not use a or b
can be issued and executed while the loads of a
and b
are the oldest instructions that haven't retired. Instructions / uops are retired in-order to support precise exceptions。 ROB 大小基本上是乱序的限制 window 用于隐藏缓存未命中等慢速操作的延迟。
另请参阅 x86 标签 wiki 中的其他链接,了解 CPU 的工作原理。 Agner Fog 的微架构指南非常适合拥有 CPU 管道的心智模型,让您大致了解代码将如何执行。
让我们假设我有两个指向未缓存的不相关地址的指针,因此在取消引用时它们都必须从主内存中一路过来。
int load_and_add(int *pA, int *pB)
{
int a = *pA; // will most likely miss in cache
int b = *pB; // will most likely miss in cache
// ... some code that does not use a or b
int c = a + b;
return c;
}
如果乱序执行允许在计算 c
的值之前执行代码,那么在现代 Intel 上如何获取值 a
和 b
处理器?
潜在的流水线内存访问是否完全序列化,或者 CPU 的内存控制器是否执行了某种提取重叠?
换句话说,如果我们假设命中主内存需要 300 个周期。获取 a
和 b
会花费 600 个周期,还是乱序执行会导致一些可能的重叠并可能花费更少的周期?
现代 CPU 有多个加载缓冲区,因此多个加载可以同时处理。内存子系统是大量流水线的,它的许多部分的吞吐量比延迟要好得多。 (例如,通过预取,Haswell 可以每 1 个时钟(从主内存)维持 8B 负载。但是,如果提前不知道地址,则延迟为数百个周期。
所以是的,Haswell 核心可以跟踪多达 72 个等待来自缓存/内存的数据的未完成加载微指令。 (这是按内核计算的。共享的 L3 缓存还需要一些缓冲区来处理整个系统对 DRAM 和内存映射 IO 的加载/存储。)
Haswell's ReOrder Buffer size is 192 uops, so up to 190 uops of work in the code that does not use a or b
can be issued and executed while the loads of a
and b
are the oldest instructions that haven't retired. Instructions / uops are retired in-order to support precise exceptions。 ROB 大小基本上是乱序的限制 window 用于隐藏缓存未命中等慢速操作的延迟。
另请参阅 x86 标签 wiki 中的其他链接,了解 CPU 的工作原理。 Agner Fog 的微架构指南非常适合拥有 CPU 管道的心智模型,让您大致了解代码将如何执行。