2012-01-13 70 views
6

是否有可能在CPU高速缓存中显式创建静态对象,以确保这些对象始终保留在高速缓存中,因此从未达到内存或上帝禁止的性能影响 - 硬盘虚拟内存?在c/C++中的CPU缓存中分配静态内存:是否有可能?

我特别感兴趣的是针对大型L3共享高速缓存,而不是针对L1,L2,指令或任何其他高速缓存,只是最大的内存块。

只是为了澄清与我在发布之前搜索的其他线程的区别,我没有兴趣将整个缓存私有化,只是少数几个类的区域。

+2

我认为你可以做的最好的就是使用GCC的[__builtin_prefetch宏](http://gcc.gnu.org/onlinedocs/gcc-3.3.6/gcc/Other-Builtins.html)。 IIRC高速缓存不能通过代码寻址,CPU自己管理它(至少在x86上)。 – 2012-01-13 17:12:09

+1

什么样的处理器?一些体系结构有指示提供缓存提示或在需要数据之前指导缓存预取。 – TJD 2012-01-13 17:13:36

+1

短管:不,你不能。你可以做的唯一事情就是保持参考的地点。不要在内存中来回跳转,而是尝试访问与前一个操作访问的数据接近的数据。另外:保持你的数据对齐缓存边界可以帮助你避免另一次缓存提取。 BTW缓存*插槽*不必是连续的。在x86上,有IIRC四个L1插槽和数百或数千个L2插槽。 (您必须与多进程机器上的其他进程共享)。 – wildplasser 2012-01-13 17:13:39

回答

12

编号缓存不可寻址,因此您无法在其中分配对象。

看起来你打算问的是:在虚拟内存中分配空间后,我能确保始终获得缓存命中吗?

这是一个更复杂的问题,答案是:部分。

通过使用操作系统的内存管理API(例如mlock()),您绝对可以避免被换出到磁盘,从而将区域标记为不可分页。或从“非分页池”开始分配。

我不认为有类似的API将内存固定到CPU缓存中。即使您可以为该块保留CPU缓存,也无法避免缓存未命中。如果另一个内核写入内存,所有权将被转移,并且您将遭受缓存未命中和关联的总线传输(可能到主内存,可能到另一个内核的缓存)。

正如Mathew在他的评论中提到的,您还可以强制缓存未命中与管道中的其他有用工作同时发生,以便数据在需要时缓存。

1

您可以运行另一个线程来遍历数据并将其带入L3缓存。