我想通过将四个块中的组件相加来从另一个数组创建一个数组,例如:
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,但这不符合我的要求。有没有人有关于如何加快速度的提示?
答案 0 :(得分: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倍。但是内圈中的元素越多,外圈中的元素越少,他的速度就越快。
答案 1 :(得分:0)
您正在尝试对矢量进行抽取。 N = 4的vDSP_sve将加速你的内循环。 如果你最终想要4个值的平均值,VDSP_mean。