Power7架构上的混合装配标量/矢量

时间:2015-02-25 20:51:12

标签: assembly simd processor powerpc fpu

从2年开始,我正在开发一个库:cyme来对“友好容器”执行SIMD计算。我能够达到处理器的最大性能。通常是用户定义的容器,并使用以下语法编写内核(简单示例):

 for(i...)
 W[i] = R[i]+R[i]+R[i]+R[i]+R[i];

R [i] + R [i] + ...使用SIMD寄存器执行操作。我可以精确控制asm的生成(使用模板表达式)。我完全满意,但是几天后我正在探索Power架构。 Power7处理器有4个浮点单元和一个向量单元(来自维基百科我读到:“POWER7处理器有一个指令序列单元,每个周期能够向一组队列发送最多六条指令”)。

我的想法是生成结合了串行和向量指令的ASM,因此我可以同时使用5个单元。我做到了,我的pb现在开始了:

以前代码的第一个ASM版本,纯SIMD-Power是:

.L536:
    lxvd2x 0,0,9
    stxvd2x 0,1,31
    lxvd2x 12,0,9
    stxvd2x 12,1,30
    xvadddp 0,0,12
    lxvd2x 12,0,9
    xvadddp 0,0,12
    xvadddp 0,0,12
    xvadddp 0,0,12
    stxvd2x 0,0,9
    addi 9,9,176
    cmpld 7,28,9
    bne 7,.L536

“漂亮”的混合串行/ SIMD(循环执行的迭代次数较少)是:

.L547:
    std 31,128(1)
    std 31,136(1)
    lfd 12,24(9)
    stxvd2x 63,1,30
    lfd 11,16(9)
    fadd 10,12,12
    fadd 9,11,11
    fadd 10,10,12
    fadd 9,9,11
    fadd 10,10,12
    fadd 9,9,11
    lxvd2x 0,0,9
    std 31,480(1)
    std 31,488(1)
    stfd 11,128(1)
    stfd 12,136(1)
    stxvd2x 63,1,29
    stxvd2x 0,1,30
    fadd 10,10,12
    fadd 9,9,11
    stfd 10,24(9)
    stfd 9,16(9)
    lxvd2x 10,0,9
    stfd 11,480(1)
    stfd 12,488(1)
    stxvd2x 10,1,29
    xvadddp 0,0,10
    lxvd2x 12,0,9
    xvadddp 0,0,12
    xvadddp 0,0,12
    xvadddp 0,0,12
    stxvd2x 0,0,9
    addi 9,9,352
    cmpld 7,28,9
    bne 7,.L547 

第一个代码的基准(一个线程但我应该使用两个?)是0.2 [s]而混合版本是0.25 [s]。我对处理器架构的了解太有限,无法理解为什么混合版本速度较慢。

生成汇编语言混合向量和串行指令是一个很有意思的想法,所以如果有人有建议,是否有可能?

最佳,

++吨

ps1:SIMD展开版应该更快,我知道并且我做到了,但我现在专注于这个混合版本。

ps2:gcc 4.9.1,Power7-IBM,8205-E6C

1 个答案:

答案 0 :(得分:2)

我没有亲身体验这些,但根据this PDF,听起来像7系列合并了以前单独的标量和矢量浮点单位以节省模具空间。如果这是准确的,则交错将无法在矢量化指令之外实现任何类型的并行化。

摘自:

  

与之前的PowerPC设计不同,POWER7 FPU融合了标量和   将FPU导入执行三个浮点的单个单元   指令集

您是否可以访问POWER6来测试交错代码?我很想知道这是怎么回事。