0

コンポーネントを 4 つのブロックで合計して、別の配列から配列を作成したいと思います。たとえば、次のようになります。

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

これを加速させたい。vDSP や v​​Force など、iOS で利用可能なライブラリを調べましたが、適切なものが見つかりませんでした。最も近い候補は vDSP_vswsum ですが、それは私が望んでいることではありません。これをスピードアップする方法についてのヒントはありますか?

4

2 に答える 2

2

私の解決策は、ストライドで 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 倍高速でした。ただし、内側のループの要素が多く、外側のループの要素が少ないと、高速になる可能性があります。

于 2014-06-12T06:28:47.820 に答える