首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何预取不常用的代码?

如何预取不常用的代码?
EN

Stack Overflow用户
提问于 2013-04-25 23:24:43
回答 2查看 3.9K关注 0票数 4

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-26 00:01:13

答案取决于您的CPU架构。

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

该函数如下所示:

代码语言:javascript
复制
__builtin_prefetch(const void *address, int locality);

locality参数应在0...3范围内。假设locality直接映射到PREFETCHh指令的h部分,您希望传递1或2,这要求将数据加载到L2和更高的缓存中。请参阅 (PDF)第4-277页。(Find other volumes here.)

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

票数 9
EN

Stack Overflow用户

发布于 2013-04-25 23:40:24

没有任何(官方1 x86)指令来预取代码,只有数据。我发现这是一个相当奇怪的用例,其中代码路径是预先知道的,但很少执行,而且预取代码有一个显著的好处。在这种特殊情况下,预加载代码有很大的好处,这一点很好理解,因为它不仅需要分析代码长时间未命中时明显变慢的原因,还需要确定在处理器可以通过正常的代码加载机制预取代码之前,是否有空闲的总线周期来实际加载代码。

您可以使用提取到L2中的prefetch指令,它通常在I- cache和D-cache之间共享。

1我知道有一些“秘密”指令允许处理器操作缓存内容,但由于这些指令需要大量的额外工作,即使您可以在用户模式代码中使用它们,我也希望这不是一些内核模式代码。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16218757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档