指针间接是否比条件更昂贵?

指针间接(获取值)是否比条件更昂贵?

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

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

有没有人有关于此事的可靠数据(或合理的意见)?

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

如果您碰巧知道一个值得注意的情况,即分支比缓存间接更便宜(有或没有分支预测),请提及它。

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

1缓存中的数据(L1,L2,L3)的频率是多少,或者必须从RAM一直获取的频率是多少?

从RAM中取出大约需要10-40ns。 当然,这将填充整个缓存行,而不是那么多,所以如果你再使用接下来的几个字节,它绝对不会“伤害”。

2它是什么处理器?

较旧的英特尔奔腾4以其漫长的流水线阶段而闻名,并且需要25-30个时钟周期(2GHz时约15ns)从错误预测的分支“恢复”。

3条件如何“可预测”?

分支预测确实有助于现代处理器,它们也可以很好地应对“不可预测的”分支,但它确实有点伤害。

4缓存的“繁忙”和“脏”程度如何?

如果你不得不丢弃一些脏数据来填充缓存行,那么在“获取数据”时间内还需要15-50ns。

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

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

最后,当然,编译器USUALLY非常清楚什么是最好的…;)

总之,很难肯定地说,在你的情况下告诉什么更好的唯一方法是对替代解决方案进行基准测试。 我会认为间接内存访问比跳转更快,但是没有看到源编译的代码,很难说。

这真的取决于你的平台。 没有看目标CPU的内部,没有一个正确的答案。 我的建议是在测试应用程序中测量它,看看是否有明显的差异。

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

它取决于处理器与处理器,但根据您正在使用的数据集,由错误预测的分支(或某些情况下排序错误的指令)引起的管道刷新可能比简单的缓存未命中更具破坏性。

例如,在PowerPC情况下,未采用(但预计采用)的分支花费大约22个周期(重新填充流水线所花费的时间),而L1缓存未命中可能花费600左右的存储周期。 但是,如果您要访问连续数据,最好不要分支,让处理器缓存 – 错过您的数据,代价是3个周期(预计采取采取的分支)对于您的每一组数据重新处理。

这一切归结为:自己测试一下。 对于所有问题,答案都不是决定性的。

由于处理器必须预测条件答案以便计划哪个指令有更多机会被执行,我会说指令的实际成本并不重要。

有条件的指令效率很低,因为它们使流程不可预测。