目录

  • 简介
  • 开始
    • 安装ARMIE
      • 安装之前
      • 安装步骤
      • 安装之后
    • 开始使用ARM 指令模拟器
      • 开始之前
      • 步骤
      • 示例:编译并执行一个“Hello World”程序
      • 示例:编译,向量化和执行有SVE代码的程序
      • 下一步
      • 相关概念
      • 相关指南
      • 相关信息
    • 疑难解答:Use -s
      • `-S`和`--show-drrun-cmd`选项
      • 联系Arm Support
  • 教程
    • 使用Arm指令仿真器分析SVE程序

简介

这篇指南描述如何入门并使用Arm指令模拟器(Arm Instruction Emulator, ArmIE)。Arm指令模拟器是一款跑在AArch64(也就是Arm64)平台上的软件工具,用来模拟SVE(Scalable Vector Extension)指令集。想了解SVE可以去看看,我翻译的另一篇《SVE(Scalable Vector Extension)简介》。Arm指令模拟器使你可以在没有SVE支持的硬件上跑编译好的SVE应用的二进制程序。

开始

本节介绍如何安装和开始使用 Arm® 指令仿真器。
Arm 指令仿真器 (armie) 是一个仿真器,可在任何基于 Armv8-A 的 AArch64 平台上运行,并模拟可扩展向量扩展 (SVE) 指令。 Arm 指令仿真器让您无需访问支持 SVE 的硬件即可开发 SVE 代码。

安装ARMIE

安装之前

确保Environment Modules或者Lmod Environment Modules system已经在你的机子上安装。关于如何安装Environment Modules的信息,可以参考Arm Alinea Studio environment configuration documentation文档。

安装步骤

  1. 下载合适你Linux主机平台的Arm指令模拟器包。可以在Arm Instruction Emulator 下载页下载指令模拟器。
  2. 提取下载好的包:
    tar -xvzf <package_name>.tar.gz
    

    <package_name>替换为下载包的全名。

  3. 可以进入到提取的包目录下查看文件:
    cd <package_name>
    
  4. 以特权用户身份运行安装脚本:
    sudo ./arm-instruction-emulator-22.0*_aarch64-linux-rpm.sh <option> <option>
    

    其中<option>是指安装脚本所支持的选项。支持的选项包括:
    -a, --accept 自动接受 EULA(EULA 仍然显示)。【译者注:End User License Agreement (EULA) ,最终用户许可协议】
    -i, --install-to <location> 安装到给定目录,如果你没有sudo权限安装到/opt/arm或其他非用户目录,可以使用这个选项。
    -f, --force 强制对非空目录进行安装尝试。
    -h, --help 在终端中以帮助消息的形式显示此表。
    如果没有应用选项,那么你将执行一个默认的安装,安装包会被解包到/opt/arm/<package_name>。如果你使用-i(或者--install-to)选项指定一个自定义的安装路径,例如<install-dir>

    ./<package_name>.sh --install-to <install_dir>
    

    那么安装包将会被安装到<install_dir>

    注意
    如果你使用了--install-to选项,则需要手动使其他用户可以使用安装和模块文件(如果他们需要)。
    【译者注】我理解就是添加其他用户的权限,使得其他用户也可以有使用和访问的权限。

  5. 除非您包含 -a(或 --accept)选项,否则安装程序会显示 EULA 并提示您同意这些条款。 要同意,请在提示符下键入“yes”。 有关发行内容的更多信息,请参阅位于 <install-dir>/<package_name> 目录中的发行说明。

安装之后

ARMIE安装成功之后,接下来需要:

  • 配置你的Linux环境:

    1. 要查看系统上可用的环境模块,请运行:

      module avail
      
    2. 如果你没有看到ARMIE的环境模块,请配置MODULEPATH环境变量,把ARMIE安装路径添加进去:
      export MODULEPATH=$MODULEPATH:<install-dir>/modulefiles/
      

      然后再次坚持一下系统上是否有可用的环境模块:

      module avail
      
    3. 为系统中的处理器和您正在使用的编译器加载适当的 Arm 指令仿真器模块:
      module load armie<major-version>/<package-version>
      

      其中,<package-version><major-version>.<minor-version>{.<patch-version>}.。例如:

      module load armie22/22.0
      

      Tip:把module load 命令加入你的.profile中,每次登陆即可自动加载

    4. 检查你的PATH环境变量,它应该包含来自 <install-dir>/ 的 Arm 指令仿真器 bin 目录:
      echo $PATH /opt/arm/arm-instruction-emulator-22.0_Generic-AArch64_RHEL-8_aarch64-linux/bin64:...
      
  • 要学习如何使用Arm指令模拟器,可以去查阅 Get started with Arm Instruction Emulator.
  • 有关 Arm 提供的服务器套件和高性能计算 (HPC) 工具使用的环境变量的信息,请参阅环境变量参考主题。
  • 要卸载ARMIE,执行位于<install-dir>/arm-instruction-emulator-<version>_<microarch>_<OS>-<OS_Version>_aarch64-linux/uninstall.shuninstall.sh脚本。

开始使用ARM 指令模拟器

这篇教程用了几组简单示例来说明如何编译SVE代码以及如何使用 Arm® 指令仿真器运行生成的二进制文件。

开始之前

  • 本次任务使用Arm Compiler for Linux(Arm Allinea Studio的一部分)作为编译器。另外,你也可以使用GCC作为编译器。如果你想使用Arm Compiler for Linux,下载并安装适用你的平台的Arm Compiler for Linux。
  • 加载适用你平台的ArmIE模块。
    module load armie<major-version>/<package-version>
    

步骤

  1. 编译你的源代码,生成一个可执行的二进制文件
  2. 用ARMIE执行二进制。选择下面任意一种方式:
    1. 激活ARMIE,并指定要使用的向量长度:

      armie -msve-vector-bits=<length> ./<binary>
      
    2. 使用检测 (-i) 或仿真 (-e) 客户端调用 Arm 指令仿真器,并指定要使用的向量长度:
      armie -msve-vector-bits=<arg> -e <emulation_client> -i <instrumentation_client> -- ./<binary>
      

      检测和仿真客户端使您能够提取有关执行二进制文件的数据。

示例:编译并执行一个“Hello World”程序

在这个例子中,你将用C写一个简单的“Hello World”程序,并用Arm Compiler for Linux编译,然后使用ARMIE执行。这个例子并不包含SVE代码。

  1. 加载适用于你平台的Arm Compiler for Linux。

    module load acfl/<package-version>
    

    其中,<package-version><major-version>.<minor-version>{.<patch-version>}。例如:

    module load acfl22/22.0
    
  2. 创建一个简单的Hello World程序,并将其保存到hello.c文件里。
    /* Hello World */
    #include <stdio.h>
    int main()
    {printf("Hello World\n");return 0;
    }
    
  3. 为了生成一个可执行二进制,用Arm C/C++ 编译器编译你的程序。
    armclang -O3 -march=armv8-a+sve -o hello hello.c
    

    -O3选项开启最高级别优化,确保自动向量化被开启。-march=armv8-a+sve选项定位目标硬件为Armv8-A架构,并在可执行二进制中生成SVE指令。

    注意
    在这个例子中,没有使用SVE代码。但是,在编译要使用 Arm 指令仿真器运行的任何代码时,最好启用最高级别的自动矢量化并以支持 SVE 的架构为目标。

  4. 使用Arm指令模拟器执行生成的二进制hello
    armie -msve-vector-bits=256 ./hello
    

    这将返回:

    Hello World
    

    对于这个简单的Hello World例子,Arm指令模拟器在支持SVE的架构里跑没有SVE指令的代码。要充分发挥 Arm 指令仿真器的潜力,即仿真 SVE 指令,我们必须研究一个更复杂的应用程序。 本教程的下一部分提供了一个包含 SVE 代码的应用程序示例。

示例:编译,向量化和执行有SVE代码的程序

  1. 加载适用于你平台的Arm Compiler for Linux。

    module load acfl/<package-version>
    

    其中,<package-version><major-version>.<minor-version>{.<patch-version>}。例如:

    module load acfl22/22.0
    
  2. 创建一个叫example.c,包含以下代码:
    // example.c
    #include <stdio.h>
    #include <stdlib.h>
    #define ARRAYSIZE 1024
    int a[ARRAYSIZE];
    int b[ARRAYSIZE];
    int c[ARRAYSIZE];
    void subtract_arrays(int *restrict a, int *restrict b, int *restrict c)
    {for (int i = 0; i < ARRAYSIZE; i++)
    {a[i] = b[i] - c[i];
    }
    }
    int main() {for (int i = 0; i < ARRAYSIZE; i++)
    {// Generate a random number between 200 and 300b[i] = (rand() % 100) + 200;// Generate a random number between 0 and 100c[i] = rand() % 100;
    }
    subtract_arrays(a, b, c);
    printf("i \ta[i] \tb[i] \tc[i] \n");
    printf("=============================\n");
    for (int i = 0; i < ARRAYSIZE; i++)
    {printf("%d \t%d \t%d \t%d\n", i, a[i], b[i], c[i]);
    }
    }
    

    这段C代码用两个数组减去相应的元素,并将结果写入到第三个数组中。这三个数组使用restrict关键字声明,它向编译器表明它们在内存中不重叠。

  3. 使用Arm C/C++编译器编译C代码。
    armclang -O3 -march=armv8-a+sve -o example example.c
    
  4. 用Arm指令模拟器跑二进制。
    armie -msve-vector-bits=256 ./example
    

    这个程序最终返回:

    i       a[i]    b[i]    c[i]
    =============================
    0       197     283     86
    1       262     277     15
    2       258     293     35
    \...
    1021    165     234     69
    1022    232     295     63
    1023    204     235     31
    

    SVE架构扩展指定一个implemention defined向量长度。msve-vector-bits选项可以给Arm指令模拟器指定需要的向量长度。这个向量长度必须是128bits的倍数,最大不超过2048bits。你可以使用-mlist-vector-lengths选项列出所有有效的向量长度。

    armie -mlist-vector-lengths
    

    返回:

    128 256 384 512 640 768 896 1024 1152 1280 1408 1536 1664 1792 1920 2048
    

    下一步

    了解如何使用 Arm 指令仿真器可用的仿真和仪器客户端分析您的应用程序,可以参阅Analyze Scalable Vector Extension (SVE) applications with Arm Instruction Emulator。

相关概念

  • 疑难解答:Use -s

相关指南

  • armie command reference

相关信息

  • Learn more about Arm Instruction Emulator
  • DynamoRIO dynamic binary instrumentation tool platform
  • DynamoRIO API
  • DynamoRIO API Usage Tutorial
  • Porting and Optimizing HPC Applications for Arm SVE guide

疑难解答:Use -s

介绍如何使用 -s 选项更好地了解 Arm® 指令仿真器使用的仿真命令和文件,以及在需要进一步帮助时向 Arm Support 发送什么内容。

-S--show-drrun-cmd选项

为了展示 Arm Instruction Emulator 如何使用 DynamoRIO 的 drrun 命令来模拟和检测 SVE 二进制文件,请调用 -s(或 --show-drrun-cmd)选项。

例如,在以下命令行中,libsve_512.so 是 SVE 仿真客户端,libinscount_emulated.so 是检测客户端:

armie -s -msve-vector-bits=512 -i libinscount_emulated.so -- ./example_sve

将会返回:

/path/to/armie/bin64/drrun -client
/path/to/armie/lib64/release/libsve_512.so 0 "" -client
/path/to/armie/samples/bin64/libinscount_emulated.so 1 "" -max_bb_instrs 32 -max_trace_bbs 4 -- ./example_sve
Client inscount is running
. . .

-s 选项可让您了解 Arm 指令仿真器如何使用 DynamoRIO,并可用于将参数和调试选项传递给 DynamoRIO 的 drrun 命令。 例如,inscount 客户端有一个 -only_from_app 选项,它只计算应用程序指令并忽略库。 使用 drrun 命令传递 -only_from_app 选项:

/path/to/install/bin64/drrun -client
/path/to/install/lib64/release/libsve_512.so 0 "" -client
/path/to/install/samples/bin64/libinscount_emulated.so 1 "-only_from_app" -max_bb_instrs 32 -max_trace_bbs 4 -- ./example_sve

返回:

Client inscount is running
955 instructions executed of which 709 were SVE instructions

这表明应用程序使用了 955 条非 SVE 指令,而在计算库指令时为 118497 条。

将命令行参数传递给检测客户端的首选方法是使用 -a--arg-iclient 选项。 有关详细信息,请参阅 armie 命令参考。 上述使用 drrun 命令的方法在同时需要检测客户端的命令行参数以及 DynamoRIO 的 drrun 命令的参数和调试选项的情况下很有用。

联系Arm Support

在程序崩溃的情况下,操作系统内核会创建一个核心转储文件。 此核心转储文件的位置和名称取决于系统的核心转储配置。 如果您的配置指定核心转储文件名包含崩溃二进制文件的名称,请注意这是被模拟的可执行文件的名称,而不是 Arm 指令模拟器二进制文件名称 (armie)。

核心转储文件应与 armie --version 的输出一起发送给 Arm 支持。 但是,如果您对核心转储文件中的敏感数据存在保密问题,请不要将核心转储发送给 Arm。 但是,如果没有核心转储文件,Arm 支持团队可能无法调查您的问题。

需求请求技术支持,请联系 Arm Support。

教程

在这部分,我们学习如何为Arm指令仿真器构建仪表客户端和自定义分析仪表,以及如何适用Arm指令仿真器分析你的SVE应用程序。

使用Arm指令仿真器分析SVE程序

介绍如何使用检测和仿真客户端以及如何使用 Arm® 指令仿真器运行您的应用程序。

Arm指令模拟器开发参考指南【翻译自 armDeveloper】相关推荐

  1. ARM指令寻址方式及RealView MDK开发环境ARM汇编程序实践

    内容简介 本文根据作者在CSDN发表的树莓派ARM汇编语言编程十讲(第3讲) (CSDN链接https://blog.csdn.net/yuanzywhu/article/details/104975 ...

  2. 嵌入式系统Linux内核开发实战指南(ARM平台) 书评

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! < ...

  3. [翻译]Reactor Netty参考指南 - 8.UDP客户端

    Reactor Netty参考指南目录 原文地址 Reactor Netty提供了易于使用.易于配置的UdpClient.它隐藏了创建UDP客户端所需的大部分Netty的功能,并增加了Reactive ...

  4. [译] Cilium:BPF 和 XDP 参考指南(2021)

    Cilium:BPF和XDP参考指南_RToax-CSDN博客Table of ContentsBPF体系结构指令系统辅助功能地图对象固定尾叫BPF到BPF呼叫准时制硬化减负工具链开发环境虚拟机本文档 ...

  5. Cilium:BPF和XDP参考指南

    Table of Contents BPF体系结构 指令系统 辅助功能 地图 对象固定 尾叫 BPF到BPF呼叫 准时制 硬化 减负 工具链 开发环境 虚拟机 本文档部分针对希望深入了解BPF和XDP ...

  6. [野火]STM32 F103 HAL库开发实战指南笔记之基础总结

    1.本书配套的仿真器为 Fire-Debugger,遵循 ARM 公司的 CMSIS-DAP 标准,支持所有基于 Cortex-M 内核的单片机,常见的 M3.M4 和 M7 都可以完美支持.Fire ...

  7. [译]Cilium:BPF和XDP参考指南,一同认识eBPF【概念篇】

    当你真正认识一门科学时,你才会感受到它的魅力. eBPF技术已经不再小众.从Linux3.18的初次亮相,现在的生态算得上是"内核关联技术"里的翘楚.其中代表性的有BCC.libb ...

  8. 《嵌入式 – GD32开发实战指南》第3章 GPIO流水灯的前世今生

    开发环境: MDK:Keil 5.30 MCU:GD32F207IK 上一章通过控制GPIO的高低电平实现了流水灯,但只是告诉了大家怎么做,如何实现流水灯,本文将深入剖析的GPIO流水灯的前生今世,深 ...

  9. 苹果Arm芯片适配开发 (Apple Silicon)

    文章目录 苹果Arm芯片适配开发 (Apple Silicon) Apple Silicon 1. 将macOS应用程序移植到苹果芯片上 1.1 创建一个移植计划 1.2 获取链接库的通用版本 1.3 ...

最新文章

  1. 关于学习Python的一点学习总结(37->集合运算)
  2. 看看,这就是微软的“万物互联”系统 window10 IOT
  3. 私有云搭建 OpenStack(centos7.3, centos-release-openstack-ocata)
  4. mysql新建用户只能查看试图_Sql Server:创建用户并指定该用户只能看指定的视图,除此之外的都不让查看。...
  5. 数据库迁移工具-kettle下载
  6. 七夕王者服务器维护,七夕主题华裳上架、职业平衡来了!8月7日服务器例行维护公告...
  7. [附源码]java毕业设计户籍管理系统
  8. linux添加雅黑字体,linux安装微软雅黑等字体
  9. 关于 Window 的 UWP 应用本地回环限制以及限制解除方案
  10. android+otg+apk,android手机 OTG功能调试usb串口的demo程序
  11. python傅里叶变换 信号处理 序列_(十六)数字图像处理中的傅里叶(DFT/FFT)
  12. 解决微信扫码下载的两个方法
  13. 【Docker】11、IDEA集成Docker插件实现一键部署SpringBoot项目
  14. JavaScript:实现AlphaNumericalSort字母数字排序算法(附完整源码)
  15. VB中MID如何使用
  16. [SEO知识]如何通过SEO思维收割各大平台的流量?
  17. iphone上安装android系统,如何在iPhone上安装Android操作系统?
  18. 天津恒安标准人寿面试经验
  19. 基于FME实现等高线的计曲线连接工具,快速连接计曲线在计曲线注记点断开处的缺口,计曲线批量连接,等高线批量连接
  20. remote_message

热门文章

  1. sicily 1002
  2. MySQL修改表的字段
  3. CSS预处理器之Sass与Less
  4. 在Windows下使用Python编程
  5. win10配置lua环境
  6. 面试必问系列:5、知道多线程吗?谈谈你参与过的多线程实战场景
  7. Docker-入门基础知识(1)
  8. java获取图片相对路径_相对路径和绝对路径的区别,java获取项目访问路径的方法...
  9. 转战物联网·基础篇01-物联网之我见
  10. 53所高校研究生补贴一览表