gry*_*ypp 6 powerpc simd vectorization openmp
我想知道Power8上是否有任何编译器(gcc,xlc等)支持Power8上的OpenMP SIMD结构?我试过XL(13.1),但我无法成功编译.可能它还不支持simd构造.
我可以用gcc 4.9.1编译(带有这些标志-fopenmp -fopenmp-simd和-O1).我把2个asm文件之间的差异.
我可以说gcc 4.9能够生成altivec代码吗?为了更好地优化,我应该做什么?(我试过-O3,限制治疗)
我的代码非常简单:
int *x, *y, *z;
x = (int*) malloc(n * sizeof(int));
y = (int*) malloc(n * sizeof(int));
z = (int*) malloc(n * sizeof(int));
#pragma omp simd
for(i = 0; i < N; ++i)
z[i] = a * x[i] + y[i];
Run Code Online (Sandbox Code Playgroud)
并且生成的组件在这里
.L7:
lwz 9,124(31)
extsw 9,9
std 9,104(31)
lfd 0,104(31)
stfd 0,104(31)
ld 8,104(31)
sldi 9,8,2
ld 10,152(31)
add 9,10,9
lwz 10,124(31)
extsw 10,10
std 10,104(31)
lfd 0,104(31)
stfd 0,104(31)
ld 7,104(31)
sldi 10,7,2
ld 8,136(31)
add 10,8,10
lwz 10,0(10)
extsw 10,10
lwz 8,132(31)
mullw 10,8,10
extsw 8,10
lwz 10,124(31)
extsw 10,10
std 10,104(31)
lfd 0,104(31)
stfd 0,104(31)
ld 7,104(31)
sldi 10,7,2
ld 7,144(31)
add 10,7,10
lwz 10,0(10)
extsw 10,10
add 10,8,10
extsw 10,10
stw 10,0(9)
lwz 9,124(31)
addi 9,9,1
stw 9,124(31)
Run Code Online (Sandbox Code Playgroud)
海湾合作委员会 -O1 -fopenmp-simd
.L7:
lwz 9,108(31)
mtvsrwa 0,9
mfvsrd 8,0
sldi 9,8,2
ld 10,136(31)
add 9,10,9
lwz 10,108(31)
mtvsrwa 0,10
mfvsrd 7,0
sldi 10,7,2
ld 8,120(31)
add 10,8,10
lwz 10,0(10)
extsw 10,10
lwz 8,116(31)
mullw 10,8,10
extsw 8,10
lwz 10,108(31)
mtvsrwa 0,10
mfvsrd 7,0
sldi 10,7,2
ld 7,128(31)
add 10,7,10
lwz 10,0(10)
extsw 10,10
add 10,8,10
extsw 10,10
stw 10,0(9)
lwz 9,108(31)
addi 9,9,1
stw 9,108(31)
Run Code Online (Sandbox Code Playgroud)
为了澄清和理解细节,我还有一个应用程序是n ^ 2 nbody应用程序.这次我的问题与这些编译器(gcc 4.9和XL 13.1)和架构(Intel和Power)有关.
我将所有代码放入gist https://gist.github.com/grypp/8b9f0f0f98af78f4223e#file-input-c (输入代码input.c的完整版本)
提前致谢
小智 3
POWER Linux 上的 XL 编译器当前仅支持 OpenMP 4.0 功能的子集。目前不支持 SIMD 构造功能,因此编译器将无法识别源代码中的构造。
但是,如果您正在寻找矢量化,那么好消息是,只要您至少使用以下优化选项,XL 编译器就应该已经自动矢量化您的代码
-O3 -qhot -qarch=pwr8 -qtune=pwr8
这些选项将启用高阶循环转换以及 POWER8 特定优化,包括循环的循环自动矢量化。
之后,您应该在生成的汇编代码中看到一些类似于以下内容的 VMX 和 VSX 指令:
188: 19 2e 80 7c lxvw4x vs36,0,r5
18c: 84 09 a6 10 vslw v5,v6,v1
190: 10 00 e7 38 addi r7,r7,16
194: 10 00 a5 38 addi r5,r5,16
198: 40 28 63 10 vadduhm v3,v3,v5
19c: 80 20 63 10 vadduwm v3,v3,v4
1a0: 19 4f 66 7c stxvw4x vs35,r6,r9
1a4: 14 02 86 41 beq cr1,3b8 <foo+0x3b8>
1a8: 10 00 20 39 li r9,16
1ac: 19 4e 27 7d lxvw4x vs41,r7,r9
1b0: 19 3e a0 7c lxvw4x vs37,0,r7
Run Code Online (Sandbox Code Playgroud)
顺便说一句,您还可以使用-qreport选项从 XL 编译器获取优化报告。这将解释哪些循环被矢量化,哪些循环未被矢量化以及原因。例如
1586-542 (I) test.c 中的循环(循环索引 1,嵌套级别 0,迭代计数 100)已进行 SIMD 矢量化。
或者
1586-549 (I) test.c 中的循环(循环索引 2)未进行 SIMD 矢量化,因为数据依赖性阻止了 SIMD 矢量化。
希望这可以帮助!