2014-12-07 25 views
0

假设我向我的CPU提供了一个数组T array[N],其中T是一个大类型,大struct,大于64字节,假设64字节也是您CPU中的高速缓存行的大小;我的问题是:什么应该是可观察到的行为?我能诊断什么?处理大于其缓存行的类型时,英特尔CPU的预期行为是什么?

很明显,我假设我的T和我的array都是打包和对齐的,并且涉及的数据结构在内存布局和布局方面都进行了优化。我主要关注的是T>缓存行和可以解释在这种情况下会发生什么的技术问题。

+0

那么,即使您的类型比缓存行更大,实际的机器代码也只能访问128位或更小的访问类型。所以它与真正的小型数组没有什么不同。 – JS1 2014-12-07 09:04:09

回答

3

您的CPU没有看到类型,特别是没有struct类型或任何东西,这是一种语言特定的封装。它只能看到你的编译器将其分离出来的各个字段的访问。所有这些字段都是整数,指针或浮点数,并且CPU知道如何有效地处理这些字段。

+0

我提到了'T'的大小,我知道CPU只能以一种非常通用的方式看到“可寻址”的东西,我的观点是如何考虑这一点以及CPU如何在这种情况下运行;例如,一个64字节的高速缓存行被63字节的数据填充,被认为是不对齐的,这可能会导致性能方面的损失,那么这种情况呢?现在你已经提到了它,我还想看看一个好的源代码,它将解释我的CPU如何管理无符号和有符号整数,但这可能是OT。 – user2485710 2014-12-07 09:55:30

+0

我不确定我们是否相互了解。编译器正在为你做所有的工作,例如他确保你的数据在'struct'中正确对齐,这样你就不必担心这些事情。如果你大部分时间都不需要'struct'中的所有字段,那么实际上你可能会将数据分散到超过必需的缓存行中。但是,这并不是访问整数数组中的所有元素,例如, – 2014-12-07 13:22:57

+0

我得到的编译器部分,我有麻烦,想象CPU在这种情况下做什么,并根据什么协议。例如,一组数据(“数组”意味着任何“热”数据序列)通常基于高速缓存行的大小被分成相等的部分,例如数组[N],其中N远大于64,被分成64个字节的块,并被送到我的多核CPU的不同核心,在这一点上相对容易理解缓存一致性如何工作以及为什么需要。在任何T不适合单个缓存行的情况下,哪种协议是有效的? – user2485710 2014-12-07 14:05:47

相关问题