我编写了下面的函数,它使用 vDSP 函数调用来计算某个结果。我认为如果我使用 128 位 vFloat 数据类型重写它以避免 vDSP 函数调用,它会更快。但是我的 vFloat 代码仍然比 vDSP 版本慢 2-3 倍。
我主要针对 iOS,但最好是代码在 Mac OS 上也能正常运行。
我在长度为 256 的数组上测量这些函数的速度,这是我的应用程序的典型数组长度。我想知道如何让这个功能尽可能快地运行,因为我有很多其他人喜欢它,我希望一旦我弄清楚如何优化这个功能,我可以对所有其他人使用相同的原则。
这是 vDSP 版本,在 Mac OS 上启用积极优化后速度提高 50%,或者在不积极的编译器设置下速度提高 2-3 倍:
void asymptoticLimitTest2(float limit,
const float* input,
float* output,
size_t numSamples){
// input / limit => output
vDSP_vsdiv(input, 1, &limit, output, 1, numSamples);
// abs(output) => output
vDSP_vabs(output, 1, output, 1, numSamples);
// 1 + output => output
float one = 1.0;
vDSP_vsadd(output, 1, &one, output, 1, numSamples);
// input / output => output
vDSP_vdiv(output, 1, input, 1, output, 1, numSamples);
}
这是我的 vFloat 版本,我认为它会更快,因为它避免了所有函数调用,但对于我的应用程序的标准向量长度 256,它并不更快:
void asymptoticLimitTest3(float limit,
const float* input,
float* output,
size_t numSamples){
vFloat limitv = {limit, limit, limit, limit};
vFloat onev = {1.0,1.0,1.0,1.0};
size_t n = numSamples;
// process in chunks of 8 samples
while(n > 4){
vFloat d = vfabsf(*(vFloat *)input / limitv) + onev;
*(vFloat *)output = *(vFloat *)input / d;
input += 4;
output += 4;
n -= 4;
}
// process the remaining samples individually
while(n > 0){
float d = fabsf(*input / limit) + 1.0;
*output = *input / d;
input++;
output++;
n--;
}
}
我希望让 asymptoticLimitTest3() 比 asymptoticLimitTest2() 运行得更快。我很想听听任何可以加快 asymptoticLimitTest3() 的建议
在此先感谢您的帮助。