第一个极术社区
作者:智元珠
如果您对Arm相关技术感兴趣,欢迎私信aijishu20加入技术微信群。
摘要近年来,Arm服务器发展势头迅猛,但大多数人的电脑还处于x86环境,不便于开发。
本文介绍了如何在x86环境中基于Qemu和Docker快速构建AARCH64开发环境。
您可以从docker-hub下载到名为de v4 arm 64/a arch 643360 Ubuntu _ 19.04 _ SVE的docker image。
读者可以使用在“准备AARCH64开发环境”部分中提供的命令来进入AARCH64开发环境。 也可以使用附录中提供的方法手动创建开发环境。
到目前为止,官方版本的gcc不支持SVE intrinsics。
但是,github上的gcc-mirror仓库包含aarch64/sve-acle-branch的分支,您可以从sve acle分支的源代码中手动编译支持SVE intrinsics的gcc编译器。
更多信息请参考参考文献[2]。
本文的AARCH64开发环境包括一个手动编译的gcc,以支持SVE intrinsics的编译。
启用SVE intrinsics的编译器位于开发环境的/home/dev/hhdbz/gcc_sve/目录下。
以下所有支持SVE intrinsics的gcc编译器均内置于de v4 arm 64/a arch 643360 Ubuntu _ 19.04 _ svedockerimage中: 本文是AARCH64开发系列文章的第一篇。 以下假设所有代码都存储在~/work目录中。
AARCH64开发环境准备安装有ubuntu18.04 (以后的版本也可以是近似版本)的x86电脑,执行以下命令进入AARCH64开发环境。
sudo apt-getinstallqemu-user wget ' https://raw.github user content.com/QEMU/QEMU/master/scripts/qmu-hdbzfmt-com QEMU-hhdbzfmt-conf.sh-QEMU-path/usr a arch 64: Ubuntu _ 19.04 _ SVE # getdockerimagesudodockerrun---RM-v~RM-v
本文的实验代码可从参考文献[5]中下载。
AARCH64基本汇编编译运行
切换到目录~/work/aarch64_asm,有内置的aarch64的基本汇编测试程序。 如下
$ cat hello.s.arch armv8- a.text.align2. global main.type main,%functionmain: stp x29,x30,[sp,-16]! adrp x0、hello_str add x0、x0、 lo 12: hello _ strblprintfmovx 0、0 ldpx 29、x30、[sp]、16ret.section.rodata
$ makeruncleangcchello.s-o hello./hellohelloaarch 64rm-f hello *.OA arch 64 neon编译执行neon的测试代码在目录(~/work/neon
AARCH64 Neon汇编编译运行
这是一个批量处理和相加16个unsigned char类型数据的示例,运行make run_asm clean时将显示以下内容
$ make run _ asmcleancc-c-one on _ add3. one on _ add3. SCC-g-wall-March=armv 8.2-a-O2-c-one on _ add3_
on_add3name: data0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15name: data (new)3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18rm -f *.o neon_add3 neon_hello AARCH64 Neon intrinsics 编译运行这是一个用neon计算 1,2,3 … 加到99 的例子,运行 make run_intrinsics clean 结果如下
$ make run_intrinsics cleancc -g -Wall -march=armv8.2-a -O2 -c -o neon_hello.o neon_hello.ccc neon_hello.o -o neon_hello./neon_hellosum=4950rm -f *.o neon_add3 neon_hello AARCH64 SVE 编译运行SVE 的测试代码在目录 ~/work/sve 下面。
AARCH64 SVE 汇编编译运行这是通过sve指令计算字符串长度的例子,运行 make run_asm clean 结果如下
注意: arm sve 指令是 armv8.2 开始支持的,因此 -march 后面的参数是: armv8.2-a+sve
$ make run_asm cleancc -c -o sve_strlen.o sve_strlen.S/home/dev/hhdbz/gcc_sve/hhdbz/aarch64-linux-gnu-gcc -g -Wall -march=armv8.2-a+sve -O2 -c -o sve_strlen_test.o sve_strlen_test.ccc sve_strlen.o sve_strlen_test.o -o sve_strlen./sve_strlenlen=9 of "hello sve"rm -f *.o sve_strlen sve_hello因为这个例子的代码量比较少,因此贴出 source code 的源代码,更多内容,
见参考文献 [6]
这是一个通过 sve intrinsics 做批量运算的例子,运行 make run_intrinsics clean 结果如下
$ make run_intrinsics clean/home/dev/hhdbz/gcc_sve/hhdbz/aarch64-linux-gnu-gcc -g -Wall -march=armv8.2-a+sve -O2 -c -o sve_hello.o sve_hello.ccc sve_hello.o -o sve_hello./sve_hello0.988095 0.988095 0.988095, 0.000000, 0.9880951.488095 1.488095 1.488095, 0.500000, 0.9880951.654762 1.654762 1.654762, 0.666667, 0.9880951.738095 1.738095 1.738095, 0.750000, 0.9880951.788095 1.788095 1.788095, 0.800000, 0.9880951.821429 1.821429 1.821429, 0.833333, 0.9880951.845238 1.845238 1.845238, 0.857143, 0.9880951.863095 1.863095 1.863095, 0.875000, 0.9880951.876984 1.876984 1.876984, 0.888889, 0.9880951.888095 1.888095 1.888095, 0.900000, 0.988095rm -f *.o sve_strlen sve_hello 附录下载附件:ubuntu-19.04-dockerfile 和 docker-build.sh,
在命令行上输入如下命令,等待一段时间,环境就会创建成功。
参考文献
[1] SVE in QEMU’s linux-user mode
[2] 交叉编译支持SVE ACLE的gcc
[3] qemu-user-static release
[4] ARM64编译工具链下载
[5] AARCH64 sample code
[6] Alastair Reid’ page