【发布时间】:2016-08-27 15:52:53
【问题描述】:
让我们假设我有两个指向不相关地址的指针,这些地址没有被缓存,所以当被取消引用时,它们都必须从主内存一路来。
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 个周期,还是乱序执行会导致一些可能的重叠并且可能花费更少的周期?
【问题讨论】:
-
编辑使用正确的术语。例如。 “命中”通常用于描述缓存命中,因此“命中主存”在略读时不容易解析。当内存地址是连续的时,通常会使用“连续”。问题是它们是否被并行处理(流水线)。
-
感谢@PeterCordes,非常棒的改写。我真的很难写出这个问题,但事实上,我试图了解的底线是内存读取是否是并行处理的。
-
不用担心,如果您还没有足够的知识自行搜索并找到答案,通常很难以“正确”的方式提出问题:P
标签: performance intel cpu-architecture memory-access