标签: branch-prediction

分支预测 - 全局共享实现说明

我正在我的计算机体系结构类中完成一项任务,我们必须在C++中实现分支预测算法(对于Alpha 21264微处理器体系结构).

提供了一个解决方案作为示例.该解决方案是全局共享预测器的实现.

我只是想了解给定的解决方案,特别是正在发生的事情:

*predict (branch_info &b) {...}
Run Code Online (Sandbox Code Playgroud)

特别,

if (b.br_flags & BR_CONDITIONAL) {...}
Run Code Online (Sandbox Code Playgroud)

任何人都可以向我提供解释吗?谢谢.

c++ branch-prediction

0
推荐指数
1
解决办法
3360
查看次数

gcc分支预测

这是我的演示程序:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int cmp(const void *d1, const void *d2)
{
    int a, b;

    a = *(int const *) d1;
    b = *(int const *) d2;

    if (a > b)
        return 1;
    else if (a == b)
        return 0;

    return -1;
}

int main()
{
    int seed = time(NULL);
    srandom(seed);

    int i, n, max = 32768, a[max];

    for (n=0; n < max; n++) {

        int r = random() % 256;
        a[n] = r;

    }

    qsort(a, max, …
Run Code Online (Sandbox Code Playgroud)

c assembly gcc branch-prediction

0
推荐指数
1
解决办法
463
查看次数

分支错误预测

这个问题可能很傻,但我还是会问。我从这个Mysticial 的答案
中听说过分支预测 ,我想知道是否有可能发生以下情况

假设我有这段 C++ 代码

while(memoryAddress = getNextAddress()){

  if(haveAccess(memoryAddress))
    // change the value of *memoryAdrress
  else 
    // do something else

}
Run Code Online (Sandbox Code Playgroud)

因此,如果分支预测器在某些情况下错误地预测 if 语句为 true,然后程序更改 *memoryAddress 的值,会发生不好的情况吗?诸如分段错误之类的事情会发生吗?

branch-prediction

0
推荐指数
1
解决办法
2366
查看次数

Haswell双路径执行CPU?

Haswell现在有2个分支单位 - 如下所示:http://arstechnica.com/gadgets/2013/05/a-look-at-haswell/2/

在此输入图像描述

这是否意味着Haswell是双路径执行CPU?

在:http://ditec.um.es/~jlaragon/papers/aragon_ICS02.pdf

这是否意味着Haswell只能在整数ALU和Shift(端口6)上执行第二个分支,而不能在其他端口上的任何其他ALU上执行?

x86 x86-64 intel cpu-architecture branch-prediction

0
推荐指数
1
解决办法
470
查看次数

Visual Studio 编译器在简单 if 语句的分支预测方面有多好?

下面是一些 C++ 伪代码作为示例:

bool importantFlag = false;
for (SomeObject obj : arr) {
    if (obj.someBool) {
        importantFlag = true;
    }
    obj.doSomethingUnrelated();
}
Run Code Online (Sandbox Code Playgroud)

显然,一旦 if 语句评估为 true 并运行内部代码,就没有理由再次执行检查,因为无论哪种方式结果都是相同的。编译器是否足够聪明,能够识别这一点,还是会在每次循环迭代中继续检查 if 语句,并可能再次将 importantFlag 冗余地分配为 true?如果循环迭代次数很大,并且无法跳出循环,则这可能会对性能产生显着影响。

我通常会忽略这些情况,只是将信心寄托在编译器上,但如果能确切地知道它如何处理这些情况,那就太好了。

c++ visual-studio branch-prediction

0
推荐指数
1
解决办法
363
查看次数

分支预测是否仍在显着加快阵列处理速度?

我正在阅读一篇有趣的文章,内容涉及为什么处理排序数组比未排序数组更快?并看到@ mp31415发表的评论说:

仅作记录。在Windows / VS2017 / i7-6700K 4GHz上,两个版本之间没有区别。两种情况都需要0.6s。如果外部循环中的迭代次数增加了10倍,则两种情况下的执行时间也会增加10倍,至6s

因此,我在一个在线c / c ++编译器(我想是现代服务器体系结构)上进行了尝试,得到的排序和未排序分别为〜1.9s和〜1.85s,没有太大区别,但可重复。

因此,我想知道现代建筑是否仍然适用?问题是从2012年开始的,距离现在不远...还是我错在哪里?


重新开启的问题精确度:

  • 请忘记我添加C代码作为示例。这是一个可怕的错误。不仅代码是错误的,而且将代码发布误导了专注于代码本身而不是问题的人们。

  • 当我第一次尝试上面链接中使用的C ++代码时,只有2%的差异(1.9s和1.85s)。

  • 我的第一个问题和意图是关于上一篇文章,其c ++代码和@ mp31415的注释。

  • @rustyx发表了一个有趣的评论,我想知道它是否可以解释我观察到的内容。

    有趣的是,调试版本在排序/未排序之间的差异为400%,而发布版本的差异最大为5%(i7-7700)。

换句话说,我的问题是:

  • 为什么上一篇文章中的c ++代码不能像上一版OP所声称的那样具有良好的性能?

精确度:

  • 发布版本和调试版本之间的时间差异是否可以解释?

c c++ performance branch-prediction

-1
推荐指数
1
解决办法
174
查看次数

CMOVcc是否被视为分支指令?

我有memchr我要使非分支的这段代码:

.globl memchr
memchr:
        mov %rdx, %rcx
        mov %sil, %al
        cld
        repne scasb
        lea -1(%rdi), %rax
        test %rcx, %rcx
        cmove %rcx, %rax
        ret
Run Code Online (Sandbox Code Playgroud)

我不确定是否cmove是分支指令。是吗?如果是这样,如何重新排列我的代码,使其不分支?

assembly x86-64 cpu-architecture micro-optimization branch-prediction

-1
推荐指数
1
解决办法
128
查看次数