IBM xlC 编译器与 Altivec 进行循环优化

问题描述 投票:0回答:1

我只是在我们拥有的 power6 集群上使用 Altivec 扩展。 我注意到,当我在没有任何优化的情况下编译下面的代码时,我的加速比是 4,正如我所预期的那样。 然而,当我使用 -O3 标志再次编译它时,我成功获得了 60 的加速!

只是想知道是否有人对此有更多经验,并且能够提供一些关于编译器如何重新排列我的代码以执行这样的加速的见解。 这是通过汇编和指令流水线进行的唯一可能的优化,还是我还缺少其他可以包含在未来工作中的东西。

int main(void) {
        const int m = 1000;

        __vector signed int va;
        __vector signed int vb;
        __vector signed int vc;
        __vector signed int vd;

        int a[m];
        int b[m];
        int c[m];

        for( int i=0 ; i < m ; i++ ) {
                a[i] = i;
                b[i] = i;
                c[i] = 0;
        }

        for( int cnt = 0 ; cnt < 10000000 ; cnt++ ) {
                vd = (__vector signed int){cnt,cnt,cnt,cnt};

                for( int i = 0 ; i < m/4 ; i+=4 ) {
                        va = vec_ld(0, &a[i]);
                        vb = vec_ld(0, &b[i]);
                        vc = vec_add(vd, vec_add(va,vb));
                        vec_st(vc, 0, &c[i]);
                }
        }

        std::cout << c[0] << ", " << c[1] << ", " << c[2] << ", " << c[3] << "\n";

        return 0;
}
c++ optimization vectorization xlc
1个回答
4
投票

我在 Power 7 上做了一些工作,并且在 XLC 编译器上看到了非常奇怪的事情。但没有这么奇怪! (至少不是 60x...)

关于PowerPC系列(至少对于Power6和Power7)需要注意的一点是,与x86/x64相比,指令延迟非常长,乱序执行非常弱。

因此,内部循环(如代码中所写)将获得极低的 IPC。

现在,我能想象获得 60 倍加速的唯一方法是内部循环在 -O3 下完全展开。这是可能的,因为内循环的行程计数可以静态确定为 63。

展开该内部循环基本上可以填充整个管道。

当然我只是猜测。最好的选择是查看装配。

另外,你是如何安排这个时间的?我在 PowerPC 上看到的很多奇怪的行为都是来自定时器本身......

编辑:

由于您的示例代码相当简单,因此应该很容易(在程序集中)发现内部循环是否部分或完全展开。

© www.soinside.com 2019 - 2024. All rights reserved.