首页 > 其他 > 详细

交叉编译支持SVE ACLE的gcc

时间:2019-09-22 14:18:47      阅读:125      评论:0      收藏:0      [点我收藏+]

最近在学习AArch64的SVE技术时,发现目前可以在网上找到的gcc版本都不支持SVE intrinsic方式调用,在看文档时发现,GCC要到2020年才会支持,在github上看到了gcc仓库里确实存在一个名为aarch64/sve-acle-branch的分支:

技术分享图片

 

然后将这个分支的代码下载下来进行交叉编译,然后去编译用SVE intrinsic方式实现的SVE测试程序,发现果然可以编过,也可以运行。编译方法参考交叉编译用于生成aarch64指令的GCC (9.2),这里有一份已经编译好的:链接: https://pan.baidu.com/s/1utIj7f5kVCMYlE8BcBQ4DA 提取码: ew2b

 

测试程序:

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

// Scalar version.
void add_arrays(double * restrict dst, double *src, double c, const int N) {
    for (int i = 0; i < N; i++)
        dst[i] = src[i] + c;
}

// Vector version
void vla_add_arrays(double * restrict dst, double *src, double c, const int N) {
    int64_t i = 0;

    svbool_t pg = svwhilelt_b64(i, (int64_t)N);
    while (svptest_any(svptrue_b64(), pg)) {
        svfloat64_t vsrc = svld1(pg, src + i);
        svfloat64_t vdst = svadd_x(pg, vsrc, c);
        svst1(pg, dst + i, vdst);

        i += svcntd();
        pg = svwhilelt_b64(i, (int64_t)N);
    }
}

// Vector version
void vla_add_arrays_2(double *dst, double *src, double c, const int N) {
    for (int i = 0; i < N; i += svcntd()) {
        svbool_t Pg = svwhilelt_b64(i, N);
        svfloat64_t vsrc = svld1(Pg, &src[i]);
        svfloat64_t vdst = svadd_x(Pg, vsrc, c);
        svst1(Pg, &dst[i], vdst);
    }
}

int main(void) {
    double src[100];
    double c;
    double dst_serial[100], dst_vla[100], dst_vla2[100];
    for (int i = 0; i < 100; ++i) {
        src[i] = (double) i / ((double) i + 1);
    }

    c = src[rand() % 100];

    add_arrays(dst_serial, src, c, 100);
    vla_add_arrays(dst_vla, src, c, 100);
    vla_add_arrays_2(dst_vla2, src, c, 100);

    for (int i = 0; i < 100; ++i) {
        printf("%f %f %f, %f, %f\n", dst_serial[i], dst_vla[i], dst_vla2[i], src[i], c);
    }
    return 0; 
}

 

编译:

 

CC=/home/pengdl/work/SVE/cross_compile/install/bin/aarch64-linux-gnu-gcc
CFLAGS=-g -Wall -march=armv8.2-a+sve -O1
LDFLAGS=--static

all:demo

demo:demo.o

%.o:%c

clean:
    $(RM) *.o demo

 

 

测试运行:

$ make clean;make;
rm -f *.o demo
/home/pengdl/work/SVE/cross_compile/install/bin/aarch64-linux-gnu-gcc -g -Wall -march=armv8.2-a+sve -O1   -c -o demo.o demo.c
/home/pengdl/work/SVE/cross_compile/install/bin/aarch64-linux-gnu-gcc --static  demo.o   -o demo
pengdl@pengdl-dell:~/work/SVE/cross_compile/teset
$ qemu-aarch64 ./demo
0.988095 0.988095 0.988095, 0.000000, 0.988095
1.488095 1.488095 1.488095, 0.500000, 0.988095
1.654762 1.654762 1.654762, 0.666667, 0.988095
1.738095 1.738095 1.738095, 0.750000, 0.988095
1.788095 1.788095 1.788095, 0.800000, 0.988095
1.821429 1.821429 1.821429, 0.833333, 0.988095
1.845238 1.845238 1.845238, 0.857143, 0.988095
1.863095 1.863095 1.863095, 0.875000, 0.988095
1.876984 1.876984 1.876984, 0.888889, 0.988095
1.888095 1.888095 1.888095, 0.900000, 0.988095
... ...

 

完。

交叉编译支持SVE ACLE的gcc

原文:https://www.cnblogs.com/pengdonglin137/p/11566864.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!