Power8上的OpenMP SIMD

Power8上的OpenMP SIMD,openmp,vectorization,simd,powerpc,Openmp,Vectorization,Simd,Powerpc,我想知道Power8上是否有任何编译器(gcc,xlc等)支持Power8上的OpenMP SIMD构造?我尝试使用XL(13.1),但未能成功编译。可能它还不支持simd构造 我可以使用GCC4.9.1进行编译(使用这些标志-fopenmp-fopenmp simd和-O1)。我将两个asm文件之间的差异放在一起 我可以说GCC4.9能够生成altivec代码吗?为了优化更多,我应该怎么做?(我尝试了-O3,限制治疗) 我的代码非常简单: int *x, *y, *z; x = (int*)

我想知道Power8上是否有任何编译器(
gcc
xlc
等)支持Power8上的OpenMP SIMD构造?我尝试使用XL(13.1),但未能成功编译。可能它还不支持simd构造

我可以使用GCC4.9.1进行编译(使用这些标志
-fopenmp-fopenmp simd
-O1
)。我将两个asm文件之间的差异放在一起

我可以说GCC4.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];
带有
-O1-fopenmp simd的GCC

.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)
为了澄清和理解细节,我还有一个应用程序,即n^2 nbody应用程序。这次我的问题与这些编译器(gcc 4.9和XL 13.1)和体系结构(Intel和Power)有关

我把所有的密码都写进了gist (输入代码input.c的完整版本)

  • Power8&XLC-它表示“未对SIMD进行矢量化,因为它包含函数调用。(存在sqrtf)”。这是合理的。但是在asm代码中我可以看到xsnmsubmdp,这正常吗?(大会:)
  • Power8&gcc我尝试用两种方式编译它(使用omp simd构造和不使用omp simd构造)。它改变了我的asm代码,正常吗?(根据OpenMP,代码不应包含函数调用)(Assembilies:&)
  • i74820K&gcc我使用omp simd和不使用omp simd做了相同的测试。输出代码也不同。FMA是否影响该代码块?(组合:&)

  • 提前感谢

    我现在无法访问基于电源的机器,但在x86上对AST转储程序进行的一些实验表明,GCC 4.9.2仅在优化级别达到
    O1
    时才开始生成SIMD代码,即,以下选项应该可以做到这一点:

    -fopenmp-simd -O1
    
    GCC 5.1.0也是如此


    还请注意,向量器应用的成本模型可能会阻止它在某些情况下实际生成向量化代码。有关如何覆盖该行为,请参见
    -fsimd成本模型
    和类似选项。

    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
    
    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:40286310VADDUHMV3、v3、v5
    19c:80206310VADDUWMV3、v3、v4
    1a0:19 4f 66 7c stxvw4x vs35、r6、r9
    1a4:14 02 86 41 beq cr1,3b8
    1a8:10 00 20 39里路r9,16
    1ac:19 4e 27 7d lxvw4x vs41、r7、r9
    1b0:19 3e a0 7c lxvw4x vs37,0,r7
    
    顺便说一句,您还可以使用该选项从XL编译器获取优化报告。这将解释哪些循环是矢量化的,哪些循环不是矢量化的,原因是什么。e、 g

    1586-542(I)循环(嵌套级别为0的循环索引1和迭代计数 100)在测试时,c被SIMD矢量化

    试验c中的1586-549(I)回路(回路索引2)不是SIMD 矢量化,因为数据依赖性阻止SIMD矢量化


    希望这有帮助

    OpenMP
    simd
    构造是OpenMP 4.0的一部分,因此受GCC 4.9及更高版本的支持。XL C 13.1.0提供部分支持。@赫里斯托利耶夫感谢您的快速回复。我质疑了更多细节。对不起,我不理解Power的ISA。确保提示编译器,
    x
    y
    z
    不能相互别名。否则,编译器可能不愿意将代码矢量化。您可以对指针进行
    restrict
    处理,或者应用一些特定于编译器的pragma,提示编译器在循环中取消引用的指针不能彼此别名。您可能还必须提示编译器内存分配是四字对齐的。您可能使用启用GCC树向量器的
    -O3
    进行编译,即使没有OpenMP SIMD pragmas,这两个x86程序集输出都是完全向量化的。AVX有
    VRSQRTPS
    指令,可以同时计算8个单精度数字的1/sqrt(x),而Power8没有这样的指令(它甚至没有矢量平方根)。@HristoIliev我用-O3编译过是的,我对AVX也有同样的想法。但我不明白为什么XL编译器不能矢量化。谢谢,我编译并看到了变化。但是,我也在想,就altivec操作而言,它的优化代码是否足够,我不知道。但是,提高优化水平应该会进一步改善情况。我解决了这个问题。但有趣的是,我无法从power中获得非常好的结果,因为现在i7看起来更好。我猜这是因为SSE4你使用哪个核心i7进行测试?如果您使用的是全新的(2013年夏季之后生产,4xxx或更高版本)-那么它已经支持AVX2,因此理论上可以获得8倍的加速(如果您使用浮点而不是int,因为FMA,可能会更高)@zam谢谢您,当我启用avx时,我获得了更好的结果。但是我没有尝试过使用avx,因为我现在没有那个CPU。avx和avx2之间有这么大的区别吗?谢谢你的回复。我还有一个关于循环块的向量化的问题,当它包含函数时
     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