将C / C ++变量存储在处理器缓存中而不是系统内存中

时间:2012-02-15 19:46:47

标签: c caching cache-control

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

非常感谢您的帮助!

5 个答案:

答案 0 :(得分:6)

x86(或者我所知道的任何平台)上都没有cpu指令可以强制CPU保留L1 / L2缓存中的某些内容。更不用说将这种极低级别的细节暴露给更高级别的语言,如C / C ++。   如果没有更多关于你正在考虑什么样的表现的背景,说你需要为“表现”这样做是没有意义的。为什么您的程序如此严格依赖于仅在缓存中访问数据。说你需要这个用于安全性似乎是糟糕的安全设计。在任何一种情况下,您都必须提供更多详细信息,说明您在这里尝试做什么。

答案 1 :(得分:5)

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

有一些方法可以确保缓存用于某些数据,但它仍然存在于ram中,并且在先发制人的多任务操作系统中,您无法保证缓存内容不会被上下文切换所淹没在任何两个指令之间,除了“停止世界”或低级别的原子操作,但它们通常用于非常非常非常短的指令序列,这些指令简单地不能被中断,例如自旋锁的增量和获取,不处理加密算法一气呵成。

答案 2 :(得分:4)

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

register int i;

答案 3 :(得分:1)

您不能直接使用缓存,但可以将硬件寄存器用于整数,并且速度更快。

答案 4 :(得分:1)

如果你真的想要性能,那么在CPU寄存器中变量就更好了。

如果您不能使用寄存器,例如因为您需要跨不同的线程或核心共享相同的值(多核现在变得很常见!),您需要将变量存储到内存中。

如前所述,您无法使用调用或关键字强制将某些内存放入缓存中。 但是,缓存并不是完全愚蠢的:如果你经常使用内存块你就不会有问题将它保存在缓存中。

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

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