Car*_*lho 3 c++ prefetch low-latency
我想将一些代码预取到指令缓存中.代码路径很少使用,但我需要它在指令缓存中,或者至少在L2中用于极少数情况下使用它.我预先通知了这些罕见的情况._mm_prefetch是否适用于代码?有没有办法在缓存中获得这种不经常使用的代码?对于这个问题,我不关心可移植性,所以即使asm会这样做.
答案取决于您的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.