是否可以在 CPU 缓存中显式创建静态对象,以确保这些对象始终保留在缓存中,这样就不会从一直到达 RAM 或上帝禁止 - hdd 虚拟内存对性能造成影响?
我对大型 L3 共享缓存特别感兴趣,而不是针对 L1、L2、指令或任何其他缓存,只是最大的片上内存块。
并且只是为了澄清以区别于我在发布此之前搜索的其他线程,我对私有化整个缓存不感兴趣,只是一个小的,几个类的区域。
是否可以在 CPU 缓存中显式创建静态对象,以确保这些对象始终保留在缓存中,这样就不会从一直到达 RAM 或上帝禁止 - hdd 虚拟内存对性能造成影响?
我对大型 L3 共享缓存特别感兴趣,而不是针对 L1、L2、指令或任何其他缓存,只是最大的片上内存块。
并且只是为了澄清以区别于我在发布此之前搜索的其他线程,我对私有化整个缓存不感兴趣,只是一个小的,几个类的区域。
不,缓存是不可寻址的,所以你不能在其中分配对象。
您似乎想问的是:在虚拟内存中分配了空间后,我能否确保始终获得缓存命中?
这是一个更复杂的问题,答案是:部分。
mlock()
通过使用操作系统的内存管理 API(例如)将区域标记为不可分页,您绝对可以避免被换出到磁盘。或者从“非分页池”开始分配。
我不相信有类似的 API 可以将内存固定到 CPU 缓存中。即使您可以为该块保留 CPU 缓存,也无法避免缓存未命中。如果另一个内核写入内存,所有权将被转移,您将遭受缓存未命中和相关的总线传输(可能到主内存,也可能到另一个内核的缓存)。
正如 Mathew 在他的评论中提到的那样,您还可以强制缓存未命中与管道中的其他有用工作并行发生,以便在您需要时数据在缓存中。
您可以运行另一个线程来循环数据并将其带入 L3 缓存。