我想将一些代码预取到指令缓存中。代码路径很少使用,但我需要它位于指令缓存中,或者至少在 L2 中(在极少数情况下)。我对这些罕见的情况有一些提前通知。 _mm_prefetch 对代码有用吗?有没有办法将这些不常用的代码放入缓存中?对于这个问题,我不关心可移植性,所以即使 asm 也可以。
答案取决于您的 CPU 架构。
也就是说,如果您使用 gcc 或 clang,则可以使用__builtin_prefetch指令尝试生成预取指令。在 Pentium 3 和更高版本的 x86 类型架构上,这将生成PREFETCHh
指令,请求加载到数据缓存层次结构中。由于这些架构具有统一的 L2 和更高级别的缓存,因此可能会有所帮助。
该函数如下所示:
__builtin_prefetch(const void *address, int locality);
The locality
参数应在 0...3 范围内。假设locality
直接映射到h
的一部分PREFETCHh
指令,您想要传递 1 或 2,这要求将数据加载到 L2 和更高级别的缓存中。看英特尔® 64 和 IA-32 架构软件开发人员手册
第 2B 卷:指令集参考,M-Z (PDF)第 4-277 页。 (在这里查找其他卷.)
如果您使用的另一个编译器没有__builtin_prefetch
,看看是否有_mm_prefetch
功能。您可能需要包含头文件才能获取该函数。例如,在 OS X 上,该函数以及常量locality
参数,声明于xmmintrin.h
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)