我阅读了 C++ 中的缓存优化以及现代 CPU 用来预测下一步需要什么数据并将其复制到缓存中的机制。但是 C++ 中有没有直接的方法让知道接下来实际需要什么的程序员来确定将哪些数据复制到 CPU 缓存中?
2 回答
这因您使用的处理器和编译器而异。
假设您使用的是 Intel x86/x64 或兼容(例如 AMD)处理器,该处理器提供了许多预取指令,并且大多数编译器都包含调用它们的内在函数。在 VC++ 中,您使用_m_prefetch
or _m_prefetchw
。使用 gcc,您可以使用__builtin_prefetch
.
同样,ARM 上的 VC++__prefetch
为相同目的提供了一个内在函数(不,我真的不知道为什么他们不能使用与 x86 上相同的名称;签名和效果看起来相同)。
大多数其他相当现代的高端处理器可能提供类似的指令,我猜大多数编译器都提供内在函数以使它们可用,但就像这些一样,内在函数的名称会有所不同。就此而言,即使这些函数是编译器所固有的,大多数都要求您包含一些头文件才能使用它们——而且头文件的名称也会有所不同。
Jerry 提供的预取内在函数可以解决问题。请记住,该函数的参数控制了几种风格,确定将使用哪些级别的缓存(如果有)来保留行。例如, prefetch_NTA 不会污染缓存,而是提供仅用于立即使用的行(并且在您将很快使用它的情况下使用,并且只使用一次)
还要记住,这些指令基本上是对 CPU 的提示(它本身也很好地尝试猜测要预取哪些行)。因此,它们不能保证工作,在许多情况下它们可能会失败(如果加载了内存子系统,或者地址被换出内存)。