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

时间:2013-08-07 00:53:38

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

我读到了C ++中的缓存优化和现代CPU用来预测接下来需要什么数据的机制,将其复制到缓存中。但是C ++中是否有直接的方式让程序员知道接下来究竟需要什么,以确定哪些数据被复制到CPU缓存中?

2 个答案:

答案 0 :(得分:6)

这取决于您使用的处理器和编译器。

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

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

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

答案 1 :(得分:1)

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

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