【问题标题】:How to disable branch prediction C++/Mac/Intel如何禁用分支预测 C++/Mac/Intel
【发布时间】:2019-11-20 07:59:00
【问题描述】:

我正在为学校做作业。本质上,我们正在分析排序算法及其对大量数字的成本。我们有最好的情况(已经按顺序)、最坏的情况(倒序)和平均情况(随机顺序)。但是,对于我的几乎所有排序算法,排序最坏情况所需的时间都少于平均情况。阅读后,似乎是分支预测导致了这种情况。它正在识别模式(递减顺序)并比理论上更快地执行代码(大 O 表示法)。

我对分支预测进行了一些研究,虽然似乎有办法对其进行优化以使其更快,但我找不到任何完全禁用它的方法。有我可以使用的 G++ 标志吗?还是终端命令?

这是我的冒泡排序算法的一个例子:

void bubble(vector<long> &vector) {
    for (int i = 0; i < vector.size() - 1; i++){
        for (int j = 0; j < vector.size() - i - 1; j++) {
            if (vector[j] > vector[j + 1]) {
                long tmp = vector[j];
                vector[j] = vector[j+1];
                vector[j+1] = tmp;
            }
        }
    }
}

我的平均情况下的时间几乎是最坏情况下的两倍。

【问题讨论】:

  • "我的平均情况下的时间几乎是最坏情况下的两倍。" 这有什么问题?或者说,有什么问题? Big-O 表示法不保证真实世界的性能;它只描述了算法的复杂性。
  • @NicolBolas:这与“最差”的含义相反。你说得对,“最坏情况的复杂性”和“最坏情况的运行时间”不必对齐。
  • __builtin_expect 可能适合你:stackoverflow.com/questions/30130930/…
  • 倒序并不是所有算法的最坏情况。对于冒泡排序可能
  • 无论如何,你的学校作业涉及复杂性还是现实世界的表现?前者不受分支预测的影响(您无法通过查看执行时间来分析复杂性),而后者对于学校项目来说可能太复杂了。

标签: c++ performance optimization cpu-architecture branch-prediction


【解决方案1】:

Big-O 表示法是关于 渐近 行为的。换句话说,它描述了随着问题规模的扩大,哪些因素会成为主导因素。

预取和分支预测等 CPU 微优化可以在较小的尺寸下产生较大的相对效果。但是,相对于 O(n) 过程,O(n^2) 过程的本质是,一旦问题规模足够大,它变慢。

所以不要费心去猜测或担心分支预测的影响。只是让你的阵列更大。尝试对包含 100 万个元素的数组进行排序。或 10 亿。我向您保证:如果您认为一种情况是最坏的情况是正确的,那么它比最好的情况慢。 (提示:你说的不对。)

【讨论】:

    猜你喜欢
    • 2016-02-29
    • 2015-10-17
    • 2020-12-16
    • 2014-04-25
    • 2014-03-03
    • 2012-07-11
    • 2016-07-01
    • 2011-02-01
    • 2015-11-24
    相关资源
    最近更新 更多