【发布时间】:2014-12-04 00:21:56
【问题描述】:
我读过一篇 2006 年的文章,内容是 CPU 如何在整个 l1 缓存行上执行操作,即使在您只需要对 l1 行包含的一小部分内容进行操作的情况下(例如,加载整个 l1 行进行写入)到布尔变量显然是矫枉过正)。该文章鼓励通过以 l1 缓存友好的方式管理内存来进行优化。
假设我有两个 int 变量恰好在内存中是连续的,并且在我的代码中我连续写入这两个变量。
硬件是否将我的两个代码操作合并为单个 l1 行上的一个物理操作(假设 CPU 有一个大到足以容纳两个变量的 l1 缓存行)?
有没有办法用 C++ 或 C 向 CPU 提出这样的建议?
如果硬件不以任何方式进行整合,那么如果在代码中实现这样的事情,您认为它会产生更好的性能吗?分配一个 l1 行大小的内存块并用尽可能多的热数据变量填充它?
【问题讨论】:
-
你能贴一个链接或者你读过的文章的名字吗?另外,当您说 CPU 时,它是 RISC 还是 CISC 还是与架构无关?
-
farbrausch.de/~fg/seminars/lightspeed.html 这是您可以查看演示文稿中各种材料的页面。当我说 CPU 时,我指的是通用 x86。
-
您可能对Ulrich Drepper's "What every programmer should know about memory" 感兴趣,它说明了 Linux 上可用的 write-combining builtins,并描述了许多相关的 CPU 架构和问题。
-
我认为您可能误解了文章所说的内容。 CPU 不会将完整的缓存线加载到任何寄存器,它会通过缓存线读取/转储到下一个缓存/内存,但不会在 L1 和 CPU 之间。
标签: c++ c optimization cpu-architecture cpu-cache