【发布时间】:2010-12-30 06:03:22
【问题描述】:
对这个简单的问题表示歉意。仍然在这里与一些内存概念作斗争。问题是:假设我有一个要重复访问的预先计算好的数组 A。有没有办法告诉 C 程序让这个数组尽可能靠近 CPU 缓存以获得最快的访问速度?谢谢。
【问题讨论】:
对这个简单的问题表示歉意。仍然在这里与一些内存概念作斗争。问题是:假设我有一个要重复访问的预先计算好的数组 A。有没有办法告诉 C 程序让这个数组尽可能靠近 CPU 缓存以获得最快的访问速度?谢谢。
【问题讨论】:
在大多数架构上,无法强制阵列使用 L1/L2 缓存;通常不需要它,如果你经常访问它,它不太可能从缓存中被驱逐。
在某些体系结构中,有一组指令允许您向处理器提示将很快需要该内存位置,以便它可以尽早开始将其加载到 L1/L2 缓存 - 这称为预取,请参阅_mm_prefetch 指令例如 (http://msdn.microsoft.com/en-us/library/84szxsww(v=vs.80).aspx)。如果您正在访问一个小数组,这仍然不太可能需要。
一般的建议是 - 首先让您的数据结构缓存高效(将相关数据放在一起,打包数据等),如果探查器告诉您仍然花费时间在缓存未命中上,请稍后尝试预取并且您可以'不要进一步改进数据布局。
【讨论】:
__builtin_prefetch的扩展名:gcc.gnu.org/onlinedocs/gcc-3.3.6/gcc/Other-Builtins.html