让我们假设我有两个指针指向未缓存的不相关地址,因此它们在被取消引用时都必须从主内存一路来。
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
计算 的值之前执行代码,那么在现代英特尔处理器上如何获取值a
并b
继续进行?
潜在的流水线内存访问是否完全序列化,或者 CPU 的内存控制器是否执行了某种获取重叠?
换句话说,如果我们假设访问主存需要 300 个周期。获取a
并b
花费 600 个周期,或者乱序执行是否会导致一些可能的重叠并且可能花费更少的周期?