有可能辅助分支预测吗?

4
你能故意以特定的方式编写代码,以便分支预测器会选择大多数情况下为真的选项吗?例如,错误检查是否加载了资源。如果可能的话,你如何利用这一点呢?

1
你为什么打这么多语言的标签?C语言的答案和Java的答案是不同的。 - Daniel Pryden
1
答案是否也可能取决于硬件? - Scott Hunter
2
这怎么会是一个漏洞?分支预测并不是一个错误... - Scott Hunter
1
@ScottHunter,“exploit”在IT安全领域之外还有一个意思,即“利用某物以获得优势”。 - user253751
2
@immibis:我指的是“exploit”标签,它并不是你所暗示的意思。 - Scott Hunter
显示剩余6条评论
2个回答

8

你如何利用这个来获得优势? - Scott Hunter
对于大多数目标,告诉编译器哪个更有可能并不会改变运行时分支预测的成功率。大多数指令集架构(ISA)没有可以嵌入到机器代码中的分支提示。它的帮助在于布置函数的代码,使得可能的路径是连续的(减少了I-cache的访问次数,减少了被执行的分支),正如链接的问答中Ciro的回答所示。或者用来提示编译器在分支和无分支代码之间的选择:如果几乎总是走一条路,那么一个分支可能比计算两边并通过无分支选择更便宜,即使这样做合法。 - Peter Cordes
请参阅是否可以告诉分支预测器分支的可能性有多大?以获取详细信息,例如我的回答提到了奔腾4曾经具有分支提示,但其他x86 CPU忽略了它们。 - Peter Cordes

1
理论上可以,但实际上不行。你不会真正获得任何好处,可以自己试一下。
随着现代硬件工作方式的发展,无论你做什么,你的CPU仍将处理所有分支。但这并不重要,因为它们将同时进行处理。
要尝试自己处理分支,你需要使用汇编语言。像上面显示的编译器提示不会有太大作用。

这更像是一条评论而不是答案。你能解释一下如何“理论上”做到,而不仅仅是说“是的”吗? - Tas
1
我没有说“是”,我说的是“不”。 - Yudrist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接