我想将一些代码预取到指令缓存中。代码路径很少使用,但我需要它在指令缓存中,或者至少在L2中用于极少数情况下使用它。我预先通知了这些罕见的情况。 _mm_prefetch是否适用于代码?有没有办法在缓存中获得这种不经常使用的代码?对于这个问题,我不关心可移植性,所以即使asm会这样做。
答案 0 :(得分:7)
答案取决于您的CPU架构。
也就是说,如果您使用的是gcc或clang,则可以使用__builtin_prefetch
指令尝试生成预取指令。在Pentium 3及更高版本的x86类型体系结构中,这将生成PREFETCHh
指令,该指令请求加载到数据高速缓存层次结构中。由于这些体系结构具有统一的L2和更高级别的缓存,因此可能有所帮助。
该功能如下所示:
__builtin_prefetch(const void *address, int locality);
locality
参数应在0 ... 3范围内。假设locality
直接映射到h
指令的PREFETCHh
部分,您希望传递1或2,这要求将数据加载到L2和更高的缓存中。请参阅第4-277页的Intel® 64 and IA-32 Architectures Software Developer's Manual
Volume 2B: Instruction Set Reference, M-Z (PDF)。 (Find other volumes here。)
如果您正在使用另一个没有__builtin_prefetch
的编译器,请查看它是否具有_mm_prefetch
功能。您可能需要包含头文件才能获得该功能。例如,在OS X上,该函数和locality
参数的常量在xmmintrin.h
中声明。
答案 1 :(得分:3)
没有任何(官方[1] x86)指令来预取代码,只有数据。我发现这是一个相当离奇的用例,其中代码路径事先是已知的,但很少执行,并且预取代码有很大的好处。很高兴理解你在哪里得出的结论是,为这个特殊情况预加载代码有一个显着的好处,因为它不仅需要分析代码在没有被命中时显着变慢很长一段时间,但也确定有多个备用总线周期来实际加载代码,然后处理器可以通过它的正常加载代码机制来预取代码。
您可以使用提取到L2的prefetch
指令,这些指令通常在I和D缓存之间共享。
[1]我知道有一些“秘密”指令允许处理器操作缓存内容,但是因为那些需要大量的额外工作,即使你可以在用户模式代码中使用它们[和我期待这不是一些内核模式代码]。