我需要一种简单易用的方法来显式预取数据。我不想使用任何特定编译器或平台的特定功能,只需要通用的功能就可以跨不同平台和编译器工作。
想到一个非常天真的解决方案就是将一个byte / int从内存位置移动到一个寄存器,“应该”将该内存段调到CPU缓存中以填充一行,至少这是我的意思逻辑上假设。但也许它不会那么容易?一种可能性是编译器在特定范围内未访问该数据时优化掉操作,因此不会发生预取。
答案 0 :(得分:3)
一般来说,预取和内存加载并不完全相同。有一些根本区别:
所以坚持使用__builtin_prefetch
并让编译器付出艰苦的努力。
另外,请记住,优化编译器可能会自动生成预取指令。我想如果他们这样做,那么你必须确保你不要干涉它。
另一个有趣的事情是,一般来说,显式预取并不能提高性能,反而会略微降低性能。有关详细信息和解释为什么预取从Linux内核中完全删除,请参阅this LWN article。
希望它有所帮助。祝你好运!