在运行Linux的Intel x86平台上,在C / C ++中,如何告诉操作系统和硬件在L1 / L2缓存中存储值(例如uint32),而不是在系统内存中?例如,假设出于安全性或性能原因,我不想在DRAM中存储32位密钥(32位无符号整数),而是希望仅将其存储在处理器的缓存中。我怎样才能做到这一点?我在Intel Xeon处理器上使用Fedora 16(Linux 3.1和gcc 4.6.2)。
非常感谢您的帮助!
答案 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的整体性能。
请注意,相反(不缓存) 作为可以分配给堆内存部分的属性存在。