【问题标题】:Allocate static memory in CPU cache in c/c++ : is it possible?在 c/c++ 的 CPU 缓存中分配静态内存:可能吗?
【发布时间】:2012-02-09 21:08:40
【问题描述】:

是否可以在 CPU 缓存中显式创建静态对象,以确保这些对象始终保留在缓存中,这样就不会从一直进入 RAM 或上帝禁止 - hdd 虚拟内存中对性能造成影响?

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

为了与我在发布之前搜索的其他线程区分开来,我对将整个缓存私有化不感兴趣,只是对一小部分区域进行私有化。

【问题讨论】:

  • 我认为你能做的最好的就是使用 GCC 的__builtin_prefetch macro。 IIRC 缓存不能通过代码寻址,CPU 自己管理它(至少在 x86 上)。
  • 什么样的处理器?一些架构具有在需要数据之前给出缓存提示或指导缓存预取的指令。
  • 简短的回答:不,你不能。你唯一能做的就是保持参考的局部性。不要在内存中来回跳跃,而是尝试访问与之前操作访问的数据接近的数据。另外:保持数据在缓存边界上对齐可以帮助您避免另一个缓存提取。顺便说一句,缓存slots 不必是连续的。在 x86 上,有 IIRC 四个 L1 插槽和数百或数千个 L2 插槽。 (您必须与多进程机器上的其他进程共享)。
  • C++ 没有“CPU 缓存”的概念。
  • 如果您指定操作系统,它也会有所帮助。如果您在裸机上运行,​​您还可以使您的代码和数据更容易放入缓存中。或类似:returninfinity.com/baremetal.html

标签: c++ c memory-management cpu-cache


【解决方案1】:

没有。缓存是不可寻址的,所以不能在里面分配对象。

您似乎想问的是:在虚拟内存中分配了空间,我可以确保我总是得到缓存命中吗?

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-22
      • 1970-01-01
      • 2015-07-23
      • 2016-02-07
      • 2017-08-26
      • 1970-01-01
      • 1970-01-01
      • 2013-01-13
      相关资源
      最近更新 更多