如何使用内联汇编对POWER ISA进行矢量化(simeple eg。)数组

时间:2016-05-06 21:27:05

标签: vectorization inline-assembly powerpc

我正试图围绕如何使用GCC的内联汇编添加,乘法或实现任意数量的POWER8向量指令。希望这里有人可以举几个例子来看看GCC内联汇编的背景 - 我专门针对POWER ISA。任何教程或进一步阅读的链接都非常感谢!

所以,我对编写任何程序集都很陌生,我开始阅读IBM内联汇编教程,但它们只涵盖了加载存储和操作立即值的基本情况,我没有找到任何与向量指令有关的内容。我在追求什么。

假设我有2个输入数组v1,v2和1个输出数组v3,我想用向量指令添加它们,它看起来像什么?

我有类似的东西:

int main(void)
{
    float v1[8];
    float v2[8];
    float v3[8];

    int i=0;

    for (i=0; i<8; i++) {
        v1[i] = 1.1;
        v2[i] = 3.3;
        v3[i] = 0.0;
        printf("%.2f %.2f %.2f\n", v1[i], v2[i], v3[i]);
    }

    __asm__("before:");
    __asm__("vaddfp %0,%1,%2\n\t"
        : "=wf"(v3[0])
        : "wf"(v1[0]), "wf"(v2[0]));
    __asm__("vaddfp %0,%1,%2\n\t"
            : "=wf"(v3[4])
            : "wf"(v1[4]), "wf"(v2[4]));
    __asm__("after:");

    for (i=0; i<8; i++) {
        printf("\n%.2f %.2f %.2f\n", v1[i], v2[i], v3[i]);
    }

    return 0;
}

这实际上确实修改了v3 [0,4],但所有其他区域都保持不变。

编辑: 事实证明我使用了错误的约束和错误的指令。 下面的代码完成了我设想的,使用向量指令添加两个向量示例。

#include <stdlib.h>
#include <stdio.h>

int main(void)
{

    float *sv1, *sv2, *sv3;
    sv1 = calloc(4, sizeof(float));
    sv2 = calloc(4, sizeof(float));
    sv3 = calloc(4, sizeof(float));
    vector float *v1;
    vector float *v2;
    vector float *v3;

    v1 = (vector float*) &(sv1[0]);
    v2 = (vector float*) &(sv2[0]);
    v3 = (vector float*) &(sv3[0]);
    long i=0;

    /* populate the data */
    printf("before\n");
    for (i=0; i<4; i++) {
        sv1[i] = 1.1;
        sv2[i] = 2.2;
        sv3[i] = 0.0;
        printf("%.2f %.2f %.2f\n", sv1[i], sv2[i], sv3[i]);
    }

    __asm__("before:");
    __asm__("xvaddsp %0,%1,%2\n\t"
           : "=wf"(v3[0])
           : "wf"(v1[0]), "wf"(v2[0]));
    __asm__("after:");

    printf("after\n");
    for (i=0; i<4; i++) {
        printf("%.2f %.2f %.2f\n", sv1[i], sv2[i], sv3[i]);
    }

    return 0;
}

0 个答案:

没有答案