hpc优化for循环分支预测3

分支嵌套

有时候程序涉及到嵌套的分支,比如下面的程序

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
for(int i = 0; i < size; i++)
{
    if(a[i] > 500)
    {
        if(b[i] < 800)
        {
            if(c[i] > 100)
            {
                d[i] = e[i];
            }
        }
    }
}

程序包含了三层的分支嵌套判断,以上写法程序既不简洁且效率不是最好的,在嵌套的分支目标仅为一个一个结果分支d[i] = e[i]的情况下,可以优化为仅有一个ifelse分支的情况

1
2
3
4
5
6
7
for(int i = 0; i < size; i++)
{
    if(a[i] > 500 && b[i] < 800 && c[i] > 100)
    {
        d[i] = e[i];
    }
}

进一步还可以优化为不含ifelse的程序

1
2
3
4
for(int i = 0; i < size; i++)
{
    d[i] = (a[i] > 500 && b[i] < 800 && c[i] > 100) ? e[i] : d[i];
}

合并条件

还有一种情况是多个条件,可以通过运算将其合并为一个条件再做判断

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
for(int i = 0; i < size; i++)
{
    if(0 == a[i] && b[i] == 0 && c[i])
    {
        d[i] = e[i];
    }else
    {
        d[i] = 0;
    }
}

如以上需要满足三个整数都等于0为真,其实等价于三个整数或运算结果等于0

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
for(int i = 0; i < size; i++)
{
    //按位或后再与0比较
    if(a[i] | b[i] | c[i] == 0)
    {
        d[i] = e[i];
    }else
    {
        d[i] = 0;
    }
}

测试结果

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
---------------- test size: 100-----------------------
dt1 = 1 us
dt2 = 1 us
dt3 = 0 us
dt4 = 1 us
---------------- test size: 1000-----------------------
dt1 = 8 us
dt2 = 9 us
dt3 = 6 us
dt4 = 5 us
---------------- test size: 10000-----------------------
dt1 = 21 us
dt2 = 20 us
dt3 = 11 us
dt4 = 10 us
---------------- test size: 100000-----------------------
dt1 = 201 us
dt2 = 198 us
dt3 = 122 us
dt4 = 113 us
---------------- test size: 1000000-----------------------
dt1 = 2211 us
dt2 = 2159 us
dt3 = 1485 us
dt4 = 1461 us

微信公众号