gpt4 book ai didi

c - 如何在 ARM Cortex-a8 中使用乘法和累加内在函数?

转载 作者:太空狗 更新时间:2023-10-29 16:37:28 29 4
gpt4 key购买 nike

如何使用GCC提供的Multiply-Accumulate intrinsics?

float32x4_t vmlaq_f32 (float32x4_t , float32x4_t , float32x4_t);

谁能解释我必须传递给这个函数的三个参数。我的意思是源寄存器和目标寄存器以及函数返回什么?

求助!!!

最佳答案

简单地说 vmla 指令执行以下操作:

struct 
{
float val[4];
} float32x4_t


float32x4_t vmla (float32x4_t a, float32x4_t b, float32x4_t c)
{
float32x4 result;

for (int i=0; i<4; i++)
{
result.val[i] = b.val[i]*c.val[i]+a.val[i];
}

return result;
}

所有这些都编译成一条汇编指令:-)

您可以在 3D 图形的典型 4x4 矩阵乘法中使用此 NEON 汇编器内在函数,如下所示:

float32x4_t transform (float32x4_t * matrix, float32x4_t vector)
{
/* in a perfect world this code would compile into just four instructions */
float32x4_t result;

result = vml (matrix[0], vector);
result = vmla (result, matrix[1], vector);
result = vmla (result, matrix[2], vector);
result = vmla (result, matrix[3], vector);

return result;
}

这节省了几个周期,因为您不必在乘法后将结果相加。加法如此频繁地使用,以至于乘法累加 hsa 成为当今的主流(甚至 x86 也在最近的一些 SSE 指令集中添加了它们)。

还值得一提:像这样的乘法累加运算在线性代数和 DSP(数字信号处理)应用程序中非常常见。 ARM 非常聪明,在 Cortex-A8 NEON-Core 中实现了快速路径。如果 VMLA 指令的第一个参数(累加器)是前面的 VML 或 VMLA 指令的结果,则此快速路径启动。我可以详细说明,但简而言之,这样的指令系列的运行速度比 VML/VADD/VML/VADD 系列快四倍。

看看我的简单矩阵乘法:我就是这么做的。由于这条快速路径,它的运行速度大约比使用 VML 和 ADD 而不是 VMLA 编写的实现快四倍。

关于c - 如何在 ARM Cortex-a8 中使用乘法和累加内在函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3240440/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com