首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >指针间接比条件更昂贵吗?

指针间接比条件更昂贵吗?
EN

Stack Overflow用户
提问于 2013-01-10 00:27:20
回答 4查看 858关注 0票数 7

指针间接(获取值)比条件代价更高吗?

我观察到,大多数优秀的编译器可以在不同程度上预先计算指针的间接性--可能会删除大多数分支指令--但我感兴趣的是,间接性的成本是否大于生成代码中分支点的成本。

我希望,如果指针引用的数据不在运行时缓存中,则可能会发生缓存刷新,但我没有任何数据支持该数据。

有没有人对这件事有确凿的数据(或合理的意见)?

编辑:几张海报指出,在分支成本上没有“一般情况”:不同芯片之间的差异很大。

如果您碰巧知道一个值得注意的案例,即分支将比缓存中的间接方向更便宜(不管是否有分支预测),请提到它。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-01-10 00:40:19

这在很大程度上取决于情况。

1缓存中的数据(L1、L2、L3)是多久一次,以及数据必须从内存中取出的频率是多少?

一次从内存中提取将花费大约10-40纳秒。当然,这将填补整个缓存行的略多于这一点,所以如果您然后使用接下来的几个字节,它肯定不会“伤害那么严重”。

它是什么处理器?

较老的英特尔Pentium4因其长管道阶段而闻名,将需要25-30个时钟周期(在2 2GHz时为15 25)才能从一个被错误预测的分支中“恢复”。

3条件如何“可预测”?

分支预测在现代处理器中确实很有帮助,它们也可以很好地处理“不可预测的”分支,但它确实有点伤人。

4缓存是如何“忙”和“脏”的?

如果您必须抛出一些脏数据来填充缓存行,则在“在”时间内获取数据的基础上还需要15-50 of。

间接本身将是一条快速指令,但当然,如果下一条指令在紧接之后使用该数据,则可能无法立即执行该指令--即使数据位于L1缓存中。

在一个好的一天(很好的预测,在缓存中的目标,向正确的方向,等等),一个分支,另一方面,采取3-7周期。

最后,当然,编译器通常很清楚什么是最好的.;)

总之,很难说清楚,在您的情况下,判断什么更好的唯一方法是对替代解决方案进行基准测试。我认为间接内存访问比跳转更快,但是如果没有看到源代码编译到什么代码,就很难说了。

票数 5
EN

Stack Overflow用户

发布于 2013-01-10 00:30:40

这将取决于你的平台。如果不查看目标CPU的内部,就没有一个正确的答案。我的建议是在测试应用程序中用两种方法来衡量,看看是否有明显的差别。

我的直觉是,在现代CPU上,通过函数指针和条件分支进行分支都依赖于分支预测器的准确性,因此,如果向预测器显示类似的工作负载,我期望这两种技术具有相似的性能。(也就是说,如果它总是以同样的方式分支,那么就期望它是快速的;如果它很难预测,那么它就会受到伤害。)但是唯一确定的方法是在目标平台上运行一个真正的测试。

票数 3
EN

Stack Overflow用户

发布于 2013-01-10 00:45:26

它取决于不同处理器之间的不同,但取决于您正在处理的数据集,由错误预测的分支(或在某些情况下顺序不佳的指令)引起的流水线刷新可能比简单的缓存丢失对速度的损害更大。

例如,在PowerPC的情况下,未使用的分支(但预计会被占用)花费大约22个周期(重新填充管道所需的时间),而L1缓存丢失可能需要600个左右的内存周期。但是,如果您要访问连续的数据,最好不要分支并让处理器缓存--对您正在处理的每一组数据都要花费3个周期(预计将被获取和获取的分支)来丢失数据。

这一切归结为:你自己测试它。答案是,对于所有问题,并不是的权威。

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

https://stackoverflow.com/questions/14248898

复制
相关文章

相似问题

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