Questions tagged «branch-prediction»

26
为什么处理排序数组比处理未排序数组快?
Наэтотвопросестьответына 堆栈溢出нарусском:Почемуотсортированныймассивобрабатываетсябыстрее,чемнеотсортированный? 这是一段C ++代码,显示了一些非常特殊的行为。出于某些奇怪的原因,奇迹般地对数据进行排序使代码快了将近六倍: #include <algorithm> #include <ctime> #include <iostream> int main() { // Generate data const unsigned arraySize = 32768; int data[arraySize]; for (unsigned c = 0; c < arraySize; ++c) data[c] = std::rand() % 256; // !!! With this, the next loop runs faster. std::sort(data, data + arraySize); …

5
为什么(a * b!= 0)比Java中的(a!= 0 && b!= 0)快?
我正在用Java写一些代码,在某些时候,程序的流程是由两个int变量“ a”和“ b”是否非零(请注意:a和b永远都不为负,以及永远不会在整数溢出范围内)。 我可以用 if (a != 0 && b != 0) { /* Some code */ } 或者 if (a*b != 0) { /* Some code */ } 因为我希望这段代码每次运行可以运行数百万次,所以我想知道哪一个更快。我通过在一个巨大的随机生成的数组上进行比较来进行实验,我也很好奇该数组的稀疏性(数据分数= 0)如何影响结果: long time; final int len = 50000000; int arbitrary = 0; int[][] nums = new int[2][len]; for (double fraction …

10
如果按概率排序if ... else if语句有什么作用?
具体来说,如果我有一系列if... else if语句,并且我以某种方式预先知道每个语句将求和的相对概率,true那么按概率顺序对它们进行排序会在执行时间上造成多少差异?例如,我是否应该这样: if (highly_likely) //do something else if (somewhat_likely) //do something else if (unlikely) //do something 为此?: if (unlikely) //do something else if (somewhat_likely) //do something else if (highly_likely) //do something 显然,排序后的版本会更快,但是出于可读性或副作用的考虑,我们可能希望对它们进行非最佳排序。在实际运行代码之前,很难说出CPU在分支预测方面的表现如何。 因此,在尝试这一过程中,我最终针对特定案例回答了自己的问题,但是我也想听听其他意见/见解。 重要说明:该问题假设if语句可以任意重新排序,而对程序的行为没有任何其他影响。在我的回答中,这三个条件测试是互斥的,不会产生副作用。当然,如果必须以某种顺序对语句进行评估才能实现某些所需的行为,那么效率问题就不那么重要了。

8
是否有编译器提示GCC强制分支预测始终遵循某种方式?
对于Intel体系结构,是否有一种方法可以指示GCC编译器生成代码,该代码始终在我的代码中以特定方式强制执行分支预测?英特尔硬件是否还支持此功能?那其他编译器或硬件呢? 我会在C ++代码中使用此代码,因为我知道我希望快速运行的情况,并且即使在最近采用了另一个分支的情况下,也不必关心速度的降低。 for (;;) { if (normal) { // How to tell compiler to always branch predict true value? doSomethingNormal(); } else { exceptionalCase(); } } 作为对Evdzhan Mustafa的后续问题,提示是否可以仅在处理器第一次遇到指令时指定提示,所有后续分支预测均正常运行?

16
“中频”贵吗?
对于我的一生,我无法记住那天老师确切说了些什么,我希望您可能会知道。 该模块是“数据结构和算法”,他告诉我们以下内容: 这if句话是最昂贵的。[某物]注册[某物]。 是的,我的记忆确实很糟糕,真的很抱歉,但是我已经搜寻了几个小时,没有任何反应。有任何想法吗?

5
为什么有条件移动不容易受到分支预测失败的影响?
在阅读了这篇文章(关于StackOverflow的答案)(在优化部分)之后,我想知道为什么条件移动不容易受到分支预测失败的影响。我在一篇关于cond move的文章中找到了该文章(AMD撰写的PDF)。同样,他们声称cond的性能优势。动作。但是为什么呢?我没看到 在评估该ASM指令时,尚不清楚先前的CMP指令的结果。

7
在Java中,&可以比&&快吗?
在此代码中: if (value >= x && value <= y) { 在没有特定模式的情况下,何时value >= x和value <= y可能与否一样,使用&运算符会比使用&&? 具体来说,我正在考虑如何&&懒惰地评估右侧表达式(即,仅当LHS为true时),这意味着有条件,而在Java&中,这保证了对两个(布尔)子表达式的严格评估。两种方法的值结果都是相同的。 但是,尽管>=or<=运算符将使用一个简单的比较指令,但&&必须包含一个分支,并且该分支易受分支预测失败的影响-正如这个非常著名的问题:为什么处理排序数组要比未排序数组快? 因此,强制表达式不包含惰性成分肯定会更具确定性,并且不容易受到预测失败的影响。对? 笔记: 如果代码看起来像这样,显然我的问题的答案将是“否” if(value >= x && verySlowFunction())。我专注于“足够简单”的RHS表达式。 无论如何,那里有一个条件分支(该if语句)。我无法向自己证明这是无关紧要的,替代性表述可能是更好的示例,例如boolean b = value >= x && value <= y; 所有这些都属于可怕的微观优化领域。是的,我知道:-) ...不过有趣吗? 更新 只是为了解释我为什么感兴趣:我一直在盯着Martin Thompson在他来关于Aeron的话题之后在他的Mechanical Sympathy博客上一直在写的系统。关键信息之一是我们的硬件中包含了所有这些神奇的内容,而我们的软件开发人员却不幸地无法利用它。不用担心,我不会在所有代码上都使用s / && / \&// :-) ...但是这个站点上有很多关于通过删除分支来改善分支预测的问题,对我来说,条件布尔运算符是测试条件的核心。 当然,@ StephenC提出了一个奇妙的观点,即将代码弯曲为怪异的形状可以使JIT不太容易发现常见的优化-如果不是现在,则不是将来。而且上述非常著名的问题之所以特别,是因为它使预测的复杂性远远超出了实际优化的范围。 我非常清楚,在大多数(或几乎所有)情况下,这&&是最清晰,最简单,最快,最好的方法-尽管我非常感谢发布了答案的人,以证明这一点!我真的很想看看在任何人的经验中,是否确实有任何案例可以回答“可以&更快?”。可能是... …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.