使用Qemu運行Ubuntu文件系統 —— 搭建SVE學習環境(2)


開發環境

PC:ubuntu18.04

Qemu:4.1

Kernel:Linux-5.2

 

概述

  由於要學習ARM的SVE技術,但是目前還沒有支持SVE指令的板子,所以只能用Qemu來模擬,但是發現Qemu在用戶模式下無法設置SVE的位寬,在瀏覽ARM官網資料時發現,ARM提供了Arm Instruction Emulator下載鏈接)可以用來模擬SVE指令,並且可以設置SVE位寬,遺憾的是該模擬器只能運行在AArch64機器上,並且提供了基於ubuntu16.04的安裝包。所以,需要先在qemu上運行一個ubuntu系統,然后再在其中安裝Arm Instruction Emulator

 

正文

1、參考博客:使用Qemu運行Ubuntu文件系統(1)

2、參考博客:用Qemu搭建aarch64學習環境

3、參考博客:Qemu-4.1 橋接網絡設置

4、參考博客:安裝docker后,導致qemu的橋接網絡出現問題

5、下面是與上面不同的地方

  • 使用的是qemu-aarch64-static

6、在運行時,使用如下命令:(下面用到的制作好的ubuntu16.04鏡像可以到這里下載,用戶名"pengdl",密碼是一個空格)

sudo qemu-system-aarch64 \ -M virt \ -cpu cortex-a57 \ -smp 4 \ -m 2048M \ -kernel ./linux-5.2/arch/arm64/boot/Image \ -nographic \ -append "noinitrd root=/dev/vda rootfstype=ext4 rw" \ -nic tap \ -fsdev local,security_model=passthrough,id=fsdev0,path=/nfsroot \ -device virtio-9p-pci,id=fs1,fsdev=fsdev0,mount_tag=hostshare \ -drive if=none,file=./ubuntu_rootfs/ubuntu.ext4,id=hd0 \ -device virtio-blk-device,drive=hd0

7、系統運行起來后,可以用使用串口或者telnet以普通用戶登錄虛擬機,然后再用mount -t nfs 或者 mount -t 9p的方式將Host上的目錄掛載到虛擬機中,來安裝ARMIE。

8、可以參考前一篇交叉編譯支持SVE ACLE的gcc,對測試程序稍作修改,來看看修改SVE位寬的運行效果:

#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); printf("# %ld\n", i); } } // 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); printf("* %d\n", i); } } 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; }

 

運行時,可以設置不同的SVE位寬:

2048:

 

 

1024:

 

 

128:

 

 

完。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM