gpt4 book ai didi

c++ - IBM xlC 编译器与 Altivec 的循环优化

转载 作者:行者123 更新时间:2023-11-30 02:07:53 25 4
gpt4 key购买 nike

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

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

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;
}

最佳答案

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

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

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

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

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

当然,我只是猜测。最好的办法是查看程序集。

此外,您如何安排时间?我在 PowerPC 上看到的许多奇怪行为都来自计时器本身......

编辑:

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

关于c++ - IBM xlC 编译器与 Altivec 的循环优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7439740/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com