3

我想为 QC Hexagon 优化一个简单的乘法累加 for 循环。从手册中,对于矢量版本和非矢量版本,我并不完全清楚如何做到这一点。

假设我的循环的长度是 4 的倍数(例如,64),即,我想以 4 的因子展开循环。我该怎么做?我可以使用 C-intrinsics 或 asm-code,但我不明白如何首先进行 4x 内存加载。

这是我的循环在 C 中的样子:

Word32 sum = 0;
Word16 *pointer1; Word16 *pointer2;

for (i=0; i<64; i++)
{
    sum += pointer1[I]*pointer2[i];
}

有什么建议么?

4

1 回答 1

0

这是一个FIR滤波器实现,演示了如何使用Q6_P_vrmpyhacc_PP乘法半字/累加。该指令在 PRM 中被描述为“巨无霸”

该指令位于标量内核中,因此不需要 HVX 矢量协处理器。

void FIR08(short_8B_align Input[],
           short_8B_align Coeff[],
           short_8B_align Output[],
           int unused, int ntaps,
           int nsamples)
{
  Word64 * vInput = (Word64*)Input;
  Word64 * vCoeff = (Word64*)Coeff;
  Word64 *__restrict vOutput = (Word64*)Output;
  int i, j;
  Word64 sum0, sum1, sum2, sum3;

  for (i = 0; i < nsamples/4; i++)
  {
      sum0 = sum1 = sum2 = sum3 = 0;
      for (j = 0; j < ntaps/4; j++)
      {
          Word64 vIn1 = vInput[i+j];
          Word64 vIn2 = vInput[i+j+1];
          Word64 curCoeff = vCoeff[j];
          Word64 curIn;

          curIn = vIn1;
          sum0 = Q6_P_vrmpyhacc_PP(sum0, curIn, curCoeff);

          curIn = Q6_P_valignb_PPI(vIn2, vIn1, 2);
          sum1 = Q6_P_vrmpyhacc_PP(sum1, curIn, curCoeff);

          curIn = Q6_P_valignb_PPI(vIn2, vIn1, 4);
          sum2 = Q6_P_vrmpyhacc_PP(sum2, curIn, curCoeff);

          curIn = Q6_P_valignb_PPI(vIn2, vIn1, 6);
          sum3 = Q6_P_vrmpyhacc_PP(sum3, curIn, curCoeff);
      }

      Word64 curOut = Q6_P_combine_RR(Q6_R_combine_RhRh(sum3, sum2), Q6_R_combine_RhRh(sum1, sum0));
      vOutput[i + 1] = Q6_P_vasrh_PI(curOut, 2);
  }
}
于 2021-09-16T01:38:17.863 回答