便携式显式预取

时间:2014-02-13 17:21:49

标签: c++ c portability prefetch

我需要一种简单易用的方法来显式预取数据。我不想使用任何特定编译器或平台的特定功能,只需要通用的功能就可以跨不同平台和编译器工作。

想到一个非常天真的解决方案就是将一个byte / int从内存位置移动到一个寄存器,“应该”将该内存段调到CPU缓存中以填充一行,至少这是我的意思逻辑上假设。但也许它不会那么容易?一种可能性是编译器在特定范围内未访问该数据时优化掉操作,因此不会发生预取。

1 个答案:

答案 0 :(得分:3)

一般来说,预取和内存加载并不完全相同。有一些根本区别:

  1. 预取无效地址不会产生故障,而尝试读取,写入或执行无效地址会产生故障(如果CPU当然有MPU / MMU)。
  2. 可以进行读取和/或写入预取,而只是将一个字节读入寄存器只是将一个字节读入寄存器。
  3. 您可以(理论上)在预取时指定内存位置。
  4. CPU可能有预取的特殊指令,与内存加载指令不同。
  5. 所以坚持使用__builtin_prefetch并让编译器付出艰苦的努力。

    另外,请记住,优化编译器可能会自动生成预取指令。我想如果他们这样做,那么你必须确保你不要干涉它。

    另一个有趣的事情是,一般来说,显式预取并不能提高性能,反而会略微降低性能。有关详细信息和解释为什么预取从Linux内核中完全删除,请参阅this LWN article

    希望它有所帮助。祝你好运!