Power8上的OpenMP SIMD

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的完整版本)

  1. Power8和XLC - 它说"不是SIMD矢量化,因为它包含函数调用.(有sqrtf)".这很合理.但是在asm代码中我可以看到xsnmsubmdp是正常的吗?(程序集:https://gist.github.com/grypp/8b9f0f0f98af78f4223e#file-power8-xlc-noinnersimd-asm)
  2. Power8&gcc我尝试用2种方式编译它(使用omp simd构造而不使用).它改变了我的asm代码,这是正常的吗?(据OpenMP的,代码不应该包含函数调用)(Assembilies:https://gist.github.com/grypp/8b9f0f0f98af78f4223e#file-power8-gcc-noinnersimd-asm&https://gist.github.com/ grypp/8b9f0f0f98af78f4223e#file-power8-gcc-innersimd-asm)
  3. i74820K&gcc我用omp simd做了同样的测试,没有它.输出代码也不同.FMA会影响此代码块吗?(Assembilies:https://gist.github.com/grypp/8b9f0f0f98af78f4223e#file-i74820k-gcc-noinnersimd-asm& https://gist.github.com/grypp/8b9f0f0f98af78f4223e#file-i74820k-gcc-innersimd-asm)

提前致谢

小智 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 矢量化。

希望这可以帮助!