将 NEON 组件与非向量函数混合

Posted

技术标签:

【中文标题】将 NEON 组件与非向量函数混合【英文标题】:Mixing NEON assembly with non-vector functions 【发布时间】:2011-05-16 19:01:46 【问题描述】:

我想我找到了问题的答案。 VFP 有一个“fmacs”指令,它可以完成在 NEON/VFP 寄存器上进行标量计算的技巧。


我对 NEON 或 ARM 编程非常陌生...

我想将上三角矩阵加载到 NEON 寄存器中,并使用单精度积分(累加)向量的外积。基本思想是 A += x'*x 其中 A 是上三角矩阵。一些操作可以通过在四或双寄存器上使用 NEON 指令“vmla.f32”对操作进行矢量化来完成。但是,有时我一次只需要对一个单精度寄存器 1 进行操作,即不需要对 2 个或 4 个单精度寄存器进行操作。在下面的示例中(不起作用),我对这一行感兴趣

// A[8-14] += A[1]*x[1-7] 
"mla  s16, s16, d0[1]\n\t"

我想使用 NEON 寄存器来执行一个单精度运算。

代码sn-p:

    __asm__ volatile (
    //load x into registers
    "vldmia    %0, d0-d3\n\t"
    // load A into registers
    "vldmia    %1, d4-d12\n\t"
    "vldmia    %1, d13-d21\n\t"
    // A[0-7] += x[0]*x[0-7]
    "vmla.f32  q2, q2, d0[0]\n\t"
    "vmla.f32  q3, q3, d0[0]\n\t"
    // A[8-14] += A[1]*x[1-7]
    "mla  s16, s16, d0[1]\n\t"
    // output
    :
    // input
    : "r"(A), "r"(x)
    // registers
    : "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7", "q8", "q9", "q10"
    );

【问题讨论】:

你不会真的想从 NEON 切换到这样的 VFP 指令。最新一代 iPhone 中使用的 Cortex-A8 和 Cortex-A9(您之前发布过的内容)在此类操作之间都经历了长时间的打嗝。您最好在计算的最后部分进行矢量运算。 【参考方案1】:

所以我认为您是在问将向量与标量相乘

我会使用“vdup”将标量加载到 NEON 寄存器的所有通道中,然后相乘。

如果您可以发布您正在尝试做的纯 C 版本,我可以尝试提供更多帮助...

【讨论】:

以上是关于将 NEON 组件与非向量函数混合的主要内容,如果未能解决你的问题,请参考以下文章

ARM NEON Intrinsics:将向量的值限制为 0-255

Vue.js 基础学习之混合mixins

Neon Intrinsics各函数介绍

了解基本的内联 NEON 组件

Neon Intrinsics各函数介绍

混合 Blazor 组件、DI 和 C# 8 可为空