加载到缓存中的数据是否与缓存行大小对齐?
Is data loaded into the cache aligned to the cache line size?
假设缓存行大小为 64 字节,而我有一个对象的大小也是 64 字节。如果访问这个对象,会不会是:
- 全部加载到一个缓存行
- 只会加载对象开头和下一个 64 字节的倍数之间的部分
- 对象将被加载到两个不同的缓存行
- 其他
我感觉答案因处理器而异,但现代 CPU 的最可能结果是什么?
当谈到机器指令级别时,高级语言中可用的对象概念就消失了。通过更高级别的分配操作访问其成员将被转换为常规读写指令。因此,如果运行时系统或语言的虚拟机很聪明并且能够分配对象以获得更好的缓存利用率,在您的情况下,分配到 64 字节对齐的地址,当更高级别的语言读取对象的任何成员时,这可能在 64 字节对齐地址内的任何地方,整个对象将被加载到缓存行(因为它分配在 64 字节对齐地址)。如果运行时系统是愚蠢的,如果它只是按照程序流程中的请求分配对象,而不像您的问题中提到的那样查看情况(64 字节对象和 64 字节缓存行),那么当读取发生在对象,该成员的 64 字节对齐地址处的数据将被加载到缓存中。因此,在后一种情况下,您需要运气好或编写代码以便在对象的前面或后面放置特殊的填充以使其缓存行对齐。
假设缓存行大小为 64 字节,而我有一个对象的大小也是 64 字节。如果访问这个对象,会不会是:
- 全部加载到一个缓存行
- 只会加载对象开头和下一个 64 字节的倍数之间的部分
- 对象将被加载到两个不同的缓存行
- 其他
我感觉答案因处理器而异,但现代 CPU 的最可能结果是什么?
当谈到机器指令级别时,高级语言中可用的对象概念就消失了。通过更高级别的分配操作访问其成员将被转换为常规读写指令。因此,如果运行时系统或语言的虚拟机很聪明并且能够分配对象以获得更好的缓存利用率,在您的情况下,分配到 64 字节对齐的地址,当更高级别的语言读取对象的任何成员时,这可能在 64 字节对齐地址内的任何地方,整个对象将被加载到缓存行(因为它分配在 64 字节对齐地址)。如果运行时系统是愚蠢的,如果它只是按照程序流程中的请求分配对象,而不像您的问题中提到的那样查看情况(64 字节对象和 64 字节缓存行),那么当读取发生在对象,该成员的 64 字节对齐地址处的数据将被加载到缓存中。因此,在后一种情况下,您需要运气好或编写代码以便在对象的前面或后面放置特殊的填充以使其缓存行对齐。