vectorization - 我怎样才能使这个功能和 vDSP 版本一样快?
问题描述
我编写了下面的函数,它使用 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() 的建议
在此先感谢您的帮助。
解决方案
我对时序进行了更多测试,结果发现 vFloat 版本通常不会比 vDSP 版本慢。当我进行原始测试时,我在 for 循环中一遍又一遍地调用相同的函数来获取时间信息。当我重写循环以便将调用与对其他函数的调用交错时(这对于实际应用程序来说更正常),那么 vFloat 版本会更快。显然,vDSP 版本从重复运行相同的代码中获得了一些好处,这可能是因为代码本身保留在缓存中。
推荐阅读
- html - 从 MSHTML.IHTMLElementCollection 中提取值
- express - 为什么我的 Post 请求没有返回正确的错误?
- graphql - 在 Gatsby 中使用 GraphQl 时使用可变变量
- firebase-realtime-database - 实时数据库上的数据验证
- javascript - 将画布图像保存到磁盘
- python - 无法从 lasagne-0.1 导入任何东西
- r - 无法在R上安装
- conan - 如何将 my-helper.cmake 脚本打包到 conan 包中,并使它们可用于 CMAKE_MODULE_PATH 中的其他包
- sql-server - 为什么 SQLCMD 模式在连接到其他服务器时似乎执行 xp_cmdshell 乱序?
- android - 科尔多瓦 webview 和设备原生浏览器之间的 HTTP_USER_AGENT 差异