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

简介

这篇指南描述如何入门并使用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 300
      b[i] = (rand() % 100) + 200;
      // Generate a random number between 0 and 100
      c[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

介绍如何使用 -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® 指令仿真器运行您的应用程序。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
SimIt-ARM-3.0 给予命令行ARM指令模拟器,短小精悍,是研究ARM处理器的好工具,该模拟器既可以运行用户级别的ELF程序,又可以模拟运行Linux操作系统;提供了简单易用的调试命令,可以逐条跟踪指令的执行。 SimIt-ARM-3.0-gk-20150902.tar.bz2 HowTo 0.what is SimIt-ARM-3.0 SimIt-ARM 3.0 is an instruction-set simulator that runs both system-level and user-level ARM programs, for more about it please read user's guide file. 1.how to build tar jxvf SimIt-ARM-3.0-gk-20150902.tar.bz2 cd SimIt-ARM-3.0-gk ./configure make make install After these steps, the ./build/bindirectory contains the following programs: ema An ARM interpreter. To test the installation was successful type ./build/bin/ema test/wc configure modifiy PATH environment variable: PATH=$PATH:$HOME/SimIt-ARM-3.0-gk/build/bin ; export PATH 2. how to use 2.1 run user-level ARM programs [root@ORA9 SimIt-ARM-3.0-gk]# cd gcc-asm [root@ORA9 gcc-asm]# more hello.c /* * hello.c * Tue Sep 8 10:13:40 CST 2015 */ int main() { printf("hello world\n"); __asm("mov r0,#2\n\t" "swi 0x1\n\t"); // syscall: exit(2); } [root@ORA9 gcc-asm]# arm-linux-gcc -v Reading specs from /usr/local/arm/3.4.1/bin/../lib/gcc/arm-linux/3.4.1/specs Configured with: /opt/crosstool/crosstool-0.28/build/arm-linux/gcc-3.4.1-glibc-2.3.2/gcc-3.4.1/configure --target=arm-linux --host=i686-host_pc-linux-gnu --prefix=/opt/crosstool/arm-linux/gcc-3.4.1-glibc-2.3.2 --with-float=soft --with-headers=/opt/crosstool/arm-linux/gcc-3.4.1-glibc-2.3.2/arm-linux/include --with-local-prefix=/opt/crosstool/arm-linux/gcc-3.4.1-glibc-2.3.2/arm-linux --disable-nls --enable-threads=posix --enable-symvers=gnu --enable-__cxa_atexit --enable-languages=c,c++ --enable-shared --enable-c99 --enable-long-long Thread model: posix gcc version 3.4.1 [root@ORA9 gcc-asm]# arm-linux-gcc hello.c -o hello -static [root@ORA9 gcc-asm]# ls -l hello* -rwxr-xr-x 1 root root 520775 Sep 8 10:18 hello -rw-r--r-- 1 root root 160 Sep 8 10:15 hello.c [root@ORA9 gcc-asm]# file hello hello: ELF 32-bit LSB executable, ARM, vers

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值