如何预取不经常使用的代码?

Car*_*lho 3 c++ prefetch low-latency

我想将一些代码预取到指令缓存中.代码路径很少使用,但我需要它在指令缓存中,或者至少在L2中用于极少数情况下使用它.我预先通知了这些罕见的情况._mm_prefetch是否适用于代码?有没有办法在缓存中获得这种不经常使用的代码?对于这个问题,我不关心可移植性,所以即使asm会这样做.

rob*_*off 7

答案取决于您的CPU架构.

也就是说,如果您使用的是gcc或clang,则可以使用该__builtin_prefetch指令尝试生成预取指令.在Pentium 3及更高版本的x86类型体系结构中,这将生成一条PREFETCHh指令,该指令请求加载到数据高速缓存层次结构中.由于这些体系结构具有统一的L2和更高的缓存,因此它可能会有所帮助.

该函数如下所示:

__builtin_prefetch(const void *address, int locality);
Run Code Online (Sandbox Code Playgroud)

locality参数应该是范围为0 ... 3.假设locality直接映射到指令的h一部分PREFETCHh,您希望传递1或2,这要求将数据加载到L2和更高的缓存中.请参阅英特尔 ®64 和IA-32架构软件开发人员手册第2B卷:指令集参考,MZ(PDF)第4-277页.(在这里查找其他卷.)

如果您正在使用另一个没有的编译器__builtin_prefetch,请查看它是否具有该_mm_prefetch功能.您可能需要包含头文件才能获得该功能.例如,在OS X上,声明了该函数和locality参数的常量xmmintrin.h.

  • 请注意,即使L2在代码和数据之间统一(现在通常也是如此),TLB很少被共享.因此,当存在时,预取指令很可能使用数据TLB(intel文档不是明确的,但它在任何地方使用"数据"一词).因此,当代码运行预取字节时,它可能会生成TLB未命中,但解析它所需的条目已经在L2中准备好(页面行走条目像普通数据一样存储在L2中). (2认同)