【问题标题】:Can I control what gets copied into CPU cache in C++?我可以控制在 C++ 中复制到 CPU 缓存中的内容吗?
【发布时间】:2013-08-08 05:04:39
【问题描述】:

我阅读了 C++ 中的缓存优化以及现代 CPU 用于预测接下来需要什么数据并将其复制到缓存中的机制。但是 C++ 中有没有直接的方法让知道接下来实际需要什么的程序员来确定将哪些数据复制到 CPU 缓存中?

【问题讨论】:

  • 访问的内容将被复制到缓存中。现在,alignment 会做一点,valgrind cachegrind 做剩下的。 (不,没有直接控制。即使有,也没有理智的操作系统会暴露它:))
  • @sehe 有显式控制的处理器;想到 AltiVec。您定义一个输入流,它充当对预取器的强、粘性提示。但是,如果 OP 没有心情提及他正在编程的什么,那么最好不要进入这个话题。

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


【解决方案1】:

这因您使用的处理器和编译器而异。

假设您使用的是 Intel x86/x64 或兼容(例如 AMD)处理器,该处理器提供了许多预取指令,并且大多数编译器都包含调用它们的内部函数。对于 VC++,您可以使用 _m_prefetch_m_prefetchw。使用 gcc,您可以使用 __builtin_prefetch

同样,ARM 上的 VC++ 提供了一个 __prefetch 内在函数用于相同的目的(不,我真的不知道为什么它们不能使用与 x86 上相同的名称;签名和效果看起来相同)。

大多数其他相当现代的高端处理器可能提供类似的指令,并且 我猜大多数编译器都提供了内在函数以使它们可用,但是就像这些一样,内在函数的名称会有所不同。就此而言,即使这些函数是编译器所固有的,大多数都要求您包含一些头文件才能使用它们——而且头文件的名称也会有所不同。

【讨论】:

    【解决方案2】:

    Jerry 提供的预取内在函数可以解决问题。请记住,该函数的参数控制了几种风格,确定将使用哪些级别的缓存(如果有)来保留行。例如 prefetch_NTA不会污染缓存,而是提供仅用于立即使用的线路(并且用于您将很快使用它并且仅一次的情况)

    还要记住,这些指令基本上是对 CPU 的提示(它本身也很好地尝试猜测要预取哪些行)。因此,它们保证工作,在许多情况下它们可能会失败(如果内存子系统已加载,或者地址被换出内存)。

    【讨论】:

      猜你喜欢
      • 2017-08-26
      • 2022-08-03
      • 2013-12-04
      • 2018-07-22
      • 1970-01-01
      • 2012-02-09
      • 1970-01-01
      • 2010-10-08
      • 2013-12-30
      相关资源
      最近更新 更多