如何使用gcc提供的乘法累加内部函数?

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;
}

所有这些编译成一个单独的汇编程序指令:-)
您可以在三维图形的典型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;
}

这样可以节省几个周期,因为您不必在乘法后添加结果。加法的使用非常频繁,以至于乘法累加hsa现在成为主流(甚至x86也在最近的一些sse指令集中添加了它们)。
同样值得一提的是:这种乘法累加运算在线性代数和数字信号处理(dsp)应用中非常常见。ARM非常聪明,在Cortex-A8氖核内实现了一条快速通道。如果vml a指令的第一个参数(累加器)是前一个vml或vmla指令的结果,则会启动此快速路径。我可以详细介绍一下,但简而言之,这样一个指令系列的运行速度是vml/vadd/vml/vadd系列的四倍。
看看我的简单矩阵乘法:我确实做到了。由于这种快速路径,它的运行速度大约是使用vml和add而不是vmla编写的实现速度的四倍。

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

10-13 05:54