Hag*_*ble 13 c arm simd intrinsics neon
如何使用GCC提供的Multiply-Accumulate内在函数?
float32x4_t vmlaq_f32 (float32x4_t , float32x4_t , float32x4_t);
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释我必须传递给这个函数的三个参数.我的意思是源和目标寄存器以及函数返回的内容?
救命!!!
Nil*_*nck 20
简单地说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;
}
Run Code Online (Sandbox Code Playgroud)
所有这些编译成一个单独的汇编指令:-)
您可以在3D图形的典型4x4矩阵乘法中使用此NEON-assembler内在函数,如下所示:
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;
}
Run Code Online (Sandbox Code Playgroud)
这样可以节省几个周期,因为您不必在乘法后添加结果.经常使用加法,这些天乘法积累hsa成为主流(甚至x86在最近的一些SSE指令集中添加了它们).
另外值得一提的是:像这样的乘法累加运算在线性代数和DSP(数字信号处理)应用中非常常见.ARM非常智能,并在Cortex-A8 NEON-Core内部实现了快速路径.如果VMLA指令的第一个参数(累加器)是前面的VML或VMLA指令的结果,则该快速路径启动.我可以详细介绍,但简而言之,这样的指令系列运行速度比VML/VADD/VML/VADD系列快四倍.
看看我的简单矩阵乘法:我就是这么做的.由于这种快速路径,它的运行速度大约是使用VML和ADD而不是VMLA编写的实现的四倍.
谷歌为vmlaq_f32,提出了RVCT编译器工具的参考.这就是它所说的:
Vector multiply accumulate: vmla -> Vr[i] := Va[i] + Vb[i] * Vc[i]
...
float32x4_t vmlaq_f32 (float32x4_t a, float32x4_t b, float32x4_t c);
Run Code Online (Sandbox Code Playgroud)
和
定义以下类型以表示向量.NEON向量数据类型根据以下模式命名:<type> <size> x <通道数> _t例如,int16x4_t是包含四个通道的向量,每个通道包含一个带符号的16位整数.表E.1列出了矢量数据类型.
IOW,从函数的返回值将是包含4个32位浮点数的矢量,并且所述矢量的每个元素乘以的对应元件计算b和c,并添加的内容a.
HTH
| 归档时间: |
|
| 查看次数: |
12740 次 |
| 最近记录: |