【问题标题】:Storing C/C++ variables in processor cache instead of system memory将 C/C++ 变量存储在处理器缓存而不是系统内存中
【发布时间】:2012-02-15 19:46:46
【问题描述】:

在运行 Linux 的 Intel x86 平台上,在 C/C++ 中,我如何告诉操作系统和硬件将值(例如 uint32)存储在 L1/L2 缓存中,而不是存储在系统内存中?例如,假设出于安全或性能原因,我不想将 32 位密钥(32 位无符号整数)存储在 DRAM 中,而是只想将其存储在处理器的缓存中。我怎样才能做到这一点?我在 Intel Xeon 处理器上使用 Fedora 16(Linux 3.1 和 gcc 4.6.2)。

非常感谢您的帮助!

【问题讨论】:

  • 简短回答:你不能。您可以采取一些技巧来“帮助”数据保留在缓存中,但您不能将任何内容固定在缓存中。
  • 如果出于安全原因,如果您的程序可以轻松反汇编,那么尝试将其“隐藏”在缓存中对您没有多大帮助。
  • 即使你把它放在那里,它也不是永久的。以及您要从哪里读取密钥以将其放入缓存中?

标签: c caching cache-control


【解决方案1】:

我认为您不能强制将变量存储在处理器的缓存中,但您可以使用 register 关键字向编译器建议应将给定变量分配到 CPU 寄存器中,声明喜欢:

register int i;

【讨论】:

  • 是的,但这只会持续到他的进程被上下文切换为止。我非常怀疑原始发布者在提出问题之前是否考虑过他的确切性能(或“安全”)要求。因此我要求提供更多细节(主要是因为这可能会迫使他自己正确地提出问题)。
  • +1 建议使用寄存器,虽然这个问题有点模棱两可!!
  • 您不必总是考虑上下文切换。是的,为 PC 编写意味着您将处理有关上下文切换的某种程度的不确定性。但是如果上下文切换是设计的一部分,还有许多其他平台可以控制,如果不是,您当然可以非常严格地控制缓存未命中。
【解决方案2】:

x86(或者我知道的任何平台)上没有 cpu 指令可以强制 CPU 将某些内容保留在 L1/L2 缓存中。更不用说将如此低级的细节暴露给 C/C++ 等高级语言了。 如果没有更多关于您正在查看的性能的上下文,说您需要为“性能”执行此操作是没有意义的。为什么您的程序如此紧密地依赖于仅访问缓存中的数据。说你需要这个来保证安全似乎是糟糕的安全设计。无论哪种情况,您都必须提供更多详细信息,说明您在此处尝试执行的操作。

【讨论】:

    【解决方案3】:

    简短的回答,你不能 - 这不是那些缓存的用途 - 它们从主内存中提供,以加快访问速度,或允许使用分支预测和流水线等高级技术。

    有一些方法可以确保缓存用于某些数据,但它仍将驻留在内存中,并且在抢占式多任务操作系统中,您不能保证缓存内容不会通过上下文切换被吹走在任何两条指令之间,除了“停止世界”或低级原子操作,但它们通常用于非常、非常、非常短的指令序列,根本不能被中断,比如自旋锁的增量和取指,不处理密码算法一气呵成。

    【讨论】:

      【解决方案4】:

      你不能直接使用缓存,但你可以使用硬件寄存器来存储整数,而且速度更快。

      【讨论】:

        【解决方案5】:

        如果你真的想要性能,一个变量最好放在 CPU 寄存器中。

        如果您不能使用寄存器,例如因为您需要在不同的线程或内核之间共享相同的值(多核现在越来越普遍!),您需要将变量存储到内存中。

        如前所述,您不能使用调用或关键字强制将一些内存放入缓存。 然而,缓存并不是完全愚蠢的:如果你的内存块被使用得足够频繁,那么将它保存在缓存中应该没有问题。

        请记住,如果您碰巧从不同的内核多次写入此内存位置,您将会对处理器中的缓存一致性块造成压力,因为它们需要确保所有缓存和下面的实际内存保持同步。 简而言之,这会降低 CPU 的整体性能。

        请注意,相反的(不缓存)确实作为属性存在,您可以分配给部分堆内存。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-06-23
          • 1970-01-01
          • 2013-04-01
          • 2018-12-10
          • 1970-01-01
          • 1970-01-01
          • 2014-03-24
          • 2017-11-25
          相关资源
          最近更新 更多