【问题标题】:Speed up summing components in a vector加快对向量中的分量求和
【发布时间】:2014-05-18 17:02:24
【问题描述】:

我想通过将四个块中的组件相加来从另一个数组创建一个数组,例如:

float inVector[256];
float outVector[64];

for(int i=0; i<64; i++){
  for(int j=0; j<4; j++){
    int k = 4*i + j;
    outVector[i] += inVector[k];
  }
}

我想加快这一进程。我查看了 iOS 中可用的库,例如 vDSP 和 vForce,但没有找到任何适合的库。最接近的候选者是 vDSP_vswsum,但这不是我想要的。有没有人有关于如何加快速度的提示?

【问题讨论】:

    标签: ios vdsp


    【解决方案1】:

    我的解决方案是大步使用 vDSP_vadd:

    vDSP_vadd(inVector,4,inVector+1,4,outVector,1,64);
    vDSP_vadd(inVector+2,4,outVector,1,outVector,1,64);
    vDSP_vadd(inVector+3,4,outVector,1,outVector,1,64);
    

    user3726960 建议的解决方案如下所示

    for(int i=0; i<64; i++){
       float out;
       vDSP_sve(inVector+4*i,1,&out,4);
       outVector[i] = out;
    }
    

    我的解决方案比原来的双循环快大约 6 倍,而 user3726960 的解决方案大约快 3 倍。但是内部循环中的元素更多而外部循环中的元素更少,他可能会更快。

    【讨论】:

      【解决方案2】:

      您正在尝试抽取向量。 N=4 的 vDSP_sve 将加速您的内部循环。 如果您最终想要 4 个值的平均值,则为 VDSP_mean。

      【讨论】:

      • 感谢您的意见。是的,这将加快循环。我最终使用了 vDSP_vadd,这在我的情况下甚至更快(但在其他情况下不一定)。看我的回答。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多