This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] AM62A7:我们如何验证高级 SIMD 指令是否实际使用/反汇编&'似乎没有显示相关的操作码

Guru**** 2331900 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1518185/am62a7-how-can-we-verify-that-the-advanced-simd-instructions-are-actually-used-disassembly-doesn-t-seem-to-show-relevant-opcodes

器件型号:AM62A7

工具/软件:

您好:

我们正在尝试通过编译代理人(例如"libtidl-tfl-delegate.so")来确定我们的 Tensorflow (使用带有 EdgeAI 工具包的 Arago-Linux;TI 提供的 OpenEmbedded 的默认构建选项)实际使用"高级 SIMD "指令、从而验证其一般可用性和后续反汇编

objdump --disassemble-all libtidl_tfl_delegate.so

我们期望看到与此处所述操作码类似的操作码: ARM Cortex-A (ARMv7-A)系列编程人员指南
但是、我们在反汇编中没有找到任何内容!

然后我们尝试了另一个类似的程序:

#include "stdio.h"
#include "arm_neon.h"

int main
{
    float a[4] = {1.0, 2.0, 3.0, 4.0};
    float b[4] = {5.0, 6.0, 7.0, 8.0};
    float res[4];
    
    float32x4_t a_vec = vld1q_f32(a);
    float32x4_t b_vec = vld1q_f32(b);
    float32x4_t res_vec = vaddq_f32(a_vec, b_vec);
    
    vst1q_f32(result, res_vec);
    
    return 0;
}

我们在目标上编译了此代码(添加了"-March=ARMv8-a+SIMD "、但未添加)、确定程序正常运行;然而、在 disassmblies 中似乎没有使用"v.add"操作码(有关相关函数的反汇编、请参阅随附的文件)。

我们如何验证矢量指令是否正在实际使用?

此致、

 Stefan Birkholz

e2e.ti.com/.../arm_2D00_neon_2D00_disassembly.txt

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    看起来您正在使用 Arm 内在函数而没有得到使用。 建议您查看 https://arm-software.github.io/acle/neon_intrinsics/advsimd.html。 快速浏览一下

    vld1q_F32应映射到  LD1{VT.4S}、[Xn]

    我同意、您的反汇编不是映射到这个、而是回到可移植代码。 可能是涉及的其他编译器标志或设置。  没有 TI 特定的内容、我们使用符合 Armv8.0标准的标准 A53内核、并开启所有选项。 我猜您会使用 gcc 编译器吗? 支持的内在函数在 https://gcc.gnu.org/onlinedocs/gcc/ARM-C-Language-Extensions-_0028ACLE_0029.html 中 。

    可能接下来的是数组(a、b、res)不会强制与128位向量对齐。 因此、编译器 出于对齐的原因而决定使用普通指令。 我认为您还必须使用向量数据类型、  float32x4_t  而不仅仅是浮点、否则内在函数不会映射到高级 SIMD 指令。 这在 ACLE 文档中是清楚的,但为了逻辑正确性,它不会无法编译,只是回退到非高级 SIMD。 我没有尝试过您的示例以这种方式进行修改、但这很可能是原因所在。

    通常、我建议查看 GCC、Arm (arm.com 和 GitHub)、然后通过堆叠溢出来获得标准 Arm 和开源工具的指导。

    具体在 TFLite 代表上,我们已经 在 /usr/lib/tflite_2.12/xnnpack-build 中包括 XNNPACK(Google Arm 优化神经网络库, github.com/.../XNNPACK )。 这或 armnn (https://github.com/ARM-software/armnn )可能已经包括了您正在考虑的极其优化的学员版本。

    Unknown 说:
    我们期待看到与此处所述操作码类似的操作码: ARM Cortex-A (ARMv7-A)系列编程人员指南
    [/报价]

    请注意、Cortex-A53内核是 Armv8.0架构、因此向量扩展是 https://developer.arm.com/documentation/dui0801/l/Overview-of-the-Armv8-Architecture/Advanced-SIMD 。 Armv7-A NEON 是指十年左右前在 Cortex-A15和其他32位内核中生成矢量扩展。 在 gcc 等软件工具中、仍然使用 NEON 一词、但更准确的是用于 A53生成的高级 SIMD。

     Pekka

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的意见-当我们找到此(看似"官方")文档时、我们可以解决问题:
     

     ARM 指令集概述

    根据这一点、在 ARMv8架构上、运算(如"add")会针对标量和向量操作数进行重载、因此向量寄存器暗示了高级 SIMD 功能的使用(例如、请参阅上面的反汇编中的第55行)。 我们在 Tensorflow 设置中找到了类似的说明(同时使用 tidl-delegate 和 XNNPACK ),这解决了我们的问题。

    为了完整起见:我们使用"-March=armv8-a+SIMD "开关编译了二进制文件,但这似乎是多余的。

     Stefan