【问题标题】:What doest `vaddhn_high_s16` actually do?`vaddhn_high_s16` 实际上做了什么?
【发布时间】:2021-07-18 15:59:23
【问题描述】:

arm64 有 vaddhn_high_s16 内在函数。

此内在函数的官方 ARM 文档是 here。但是,给定的描述和伪代码都让我感到困惑。

任何人都可以使用实用的 C/C++ 代码来解释 vaddhn_high_s16 的作用吗?

例如,假设所有数据类型都已定义,并且vmulq_f32 intrinsic 可以用这个实现来解释:

float32x4_t vmulq_f32(float32x4_t a, float32x4_t b)
{
    float32x4_t r;
    for (int i=0; i<4; i++)
    {
        r[i] = a[i] * b[i];
    }
    return r;
}

【问题讨论】:

    标签: c++ simd intrinsics arm64 neon


    【解决方案1】:

    ARMv8 架构参考手册中底层addhn2 指令的文档有助于澄清事情。这通常是解决有关内在函数问题的好资源。

    当然,主要目的是将 16 位值相加,并且只保留每个结果的高 8 位。 addhn2 形式将结果写入 SIMD 寄存器的前 8 个字节,低 8 个字节保持不变。由于 C 是按值传递的,并且“就地修改”在 C 函数中不容易表示,因此内在函数让您将所需的低字节作为参数传递,该参数传递到返回值的低字节;返回值的高字节包含加法的结果。

    所以你可以这样表达:

    int8x16_t vaddhn_high_s16(int8x8_t r, int16x8_t a, int16x8_t b) {
        int8x16_t ret;
        for (int i = 0; i < 8; i++)
            ret[i] = r[i];
        for (int i = 0; i < 8; i++)
            ret[i+8] = (int8_t)((a[i] + b[i]) >> 8);
        return ret;
    }
    

    【讨论】:

      猜你喜欢
      • 2013-06-02
      • 2020-11-21
      • 2015-02-26
      • 2017-06-29
      • 2013-06-13
      • 2021-10-25
      • 2011-08-12
      • 1970-01-01
      • 2010-11-27
      相关资源
      最近更新 更多