我可以在C++中控制复制到CPU缓存中的内容吗

Can I control what gets copied into CPU cache in C++?

本文关键字:缓存 CPU C++ 控制 复制 我可以      更新时间:2023-10-16

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

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

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

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

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

Jerry提供的预取内部函数就可以完成任务。请记住,有几种风格由该函数的参数控制,用于确定缓存的哪些级别(如果有的话)将用于保持行。例如的prefetch_NTA不会污染缓存,而是只提供立即使用的行(并且在您很快就会使用它并且只使用一次的情况下使用)

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