交叉编译支持SVE ACLE的gcc
最近在学习AArch64的SVE技术时,发现目前可以在网上找到的gcc版本都不支持SVE intrinsic方式调用,在看文档时发现,GCC要到2020年的GCC10时才会支持:

在github上看到了gcc仓库里存在一个名为aarch64/sve-acle-branch的分支:

然后将这个分支的代码下载下来进行交叉编译,然后去编译用SVE intrinsic方式实现的SVE测试程序,发现果然可以编过,也可以运行。编译方法参考交叉编译用于生成aarch64指令的GCC (9.2),这里有一份已经编译好的:链接: https://pan.baidu.com/s/1s3FWLgwavaGqR427NcW-hA 提取码: kpng
测试程序:
#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 = ; 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 = ; 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 = ; 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[];
double c;
double dst_serial[], dst_vla[], dst_vla2[];
for (int i = ; i < ; ++i) {
src[i] = (double) i / ((double) i + );
} c = src[rand() % ]; add_arrays(dst_serial, src, c, );
vla_add_arrays(dst_vla, src, c, );
vla_add_arrays_2(dst_vla2, src, c, ); for (int i = ; i < ; ++i) {
printf("%f %f %f, %f, %f\n", dst_serial[i], dst_vla[i], dst_vla2[i], src[i], c);
}
return ;
}
编译:
CC=/home/pengdl/work/SVE/cross_compile/install/bin/aarch64-linux-gnu-gcc
CFLAGS=-g -Wall -march=armv8.-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.-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的更多相关文章
- curl 交叉编译 支持http2和openssl
touch run.sh chmod 755 run.sh mkdir build cd build ../run.sh run.sh #!/bin/bash #cd /build ../config ...
- 使用Qemu运行Ubuntu文件系统 —— 搭建SVE学习环境(2)
开发环境 PC:ubuntu18.04 Qemu:4.1 Kernel:Linux-5.2 概述 由于要学习ARM的SVE技术,但是目前还没有支持SVE指令的板子,所以只能用Qemu来模拟,但是发现Q ...
- ARM64编译工具链下载
下面是自制的用于编译ARMv8指令的交叉编译工具链: 1.运行在PC上,支持SVE指令,不支持SVE ACLE,版本GCC9.2 https://pan.baidu.com/s/1_NnwajWCel ...
- g77介绍 g77 是 Fortran77 的编译器。它对 Fortran 77 标准提供完备的支持,并支持 Fortran 90 和 95 的部分特性。 由于 Fortran 77 标准在数值计算中的影响力,g77 可能是应用最广的Fortran编译器。 在 GCC 4.0 之前,g77 是 GCC 的一部分,但现在,g77 已经停止开发。
GFORTRAN 维基百科,自由的百科全书 跳到导航 跳到搜索 此条目需要扩充. (2018年11月2日)请协助改善这篇条目,更进一步的信息可能会在讨论页或扩充请求中找到.请在扩充条目后将此模 ...
- Linux开发工具之gcc
一.gcc入门(上) 1.gcc相关概念 gcc(GNU C Compiler)编译器,最初支持C语言,现已支持C.C++.Java.Pascal.Ada.COBOL语言等:支持多种硬件平台: ...
- 从头编译ARM交叉编译环境
首先Cygwin需安装基本的命令 例如make binutils gcc 还有diffutils 没有他会报找不到cmp命令 这些都可以在setup.exe中找到 编译gcc时,需要注意一个原则:不要 ...
- CentOS 6.4中升级编译安装GCC 4.8.1 + GDB 7.6.1 + Eclipse 以及Kdump配置
在CentOS 6.4中编译安装GCC 4.8.1 + GDB 7.6.1 + Eclipse 今天在isocpp上看到"GCC 4.8.1 released, C++11 feature ...
- codeSourcery交叉编译环境
arm-none-Linux-gnueabi-gcc是 Codesourcery 公司(目前已经被Mentor收购)基于GCC推出的的ARM交叉编译工具.可用于交叉编译ARM系统中所有环节的代码,包括 ...
- Msys/MinGW与Cygwin/gcc
一. MinGW MinGW 官方网站为 http://www.mingw.org/ MinGW,即 Minimalist GNU For Windows(GCC compiler suite).它是 ...
随机推荐
- Linux学习笔记-第7天 - 编程还是要多写多练
编程思路很重要,多写是要熟悉命令用法,多练不只是要熟悉语句常用在什么环境,更要在其基础上,尝试更多的写法.
- [LeetCode] 88. Merge Sorted Array 混合插入有序数组
Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Note: T ...
- 使用IDEA+vue.js+easyUI的demo
最近,随便写了几个开发的小例子,自己总结下,留个纪念. 例子1:使用EasyUI做了一个简单界面,服务器和客户端在一起. @Controller @RequestMapping("/demo ...
- 推荐一款移动端小视频App玲珑视频
推荐一款移动端小视频App玲珑视频 一 应用描述 玲珑小视频,边看边聊![海量视频,刷个不停,还能找妹子语音聊天哦][随手拍一拍,记录美好生活,还能拿金币哦][看视频领金币.登录领金币.拍视频领金币. ...
- mysql,字符串类型id,获取最大值
说明,这个id是字符串类型,但是实际值是一个整数,获取最大值的方法是: select max(cast(id as SIGNED)) from table 另外,mysql生成伪列的方法: SELEC ...
- POJ 2249 暴力求组合数
Binomial Showdown Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 22692 Accepted: 692 ...
- scala的应用--UDF:用户自定义函数
在window10下安装了hadoop,用ida创建maven项目. <properties> <spark.version>2.2.0</spark.version&g ...
- linux 通过tar直接打包方式 迁移oracle的软件包环境:rdbms/lib/config.c
step1.修改sysctl.conf step2.修改ulimit.conf step3.打包源oracle安装包 step4.通过id{oracle的安装运行用户} 获取安装oracle的[ORA ...
- uni-app如何解决在for循环里调用异步请求获取数据顺序混乱问题?
总结/朱季谦 先前有一次做uni-app的js接口对接时,遇到过这样的情况,在for循环里,调用一个异步请求时,返回来的值顺序是乱的,因此,在以下的代码里,push到数组里的值,每次的顺序可能都是不一 ...
- 我遇到的WPF的坑
转自 林德熙Blog 本文:我遇到的WPF的坑 目录 单例应用在多实例用户无法使用 标记方法被使用 当鼠标滑过一个被禁用的元素时,让ToolTip 显示 获取设备屏幕数量 获取当前域用户 绑定资源文件 ...