在数字滤波 C++ 应用程序中,我使用std::inner_product
(with std::vector<double>
and std::deque<double>
) 计算每个数据样本的滤波器系数和输入数据之间的点积。在分析我的应用程序后,我发现不少于 85% 的执行时间都花在了std::inner_product
!
std::inner_product
例如在 GCC 中优化到什么程度?它是否使用 SIMD 指令?它是否执行循环展开?如何确保这一点?基于此,是否值得实现自定义点积函数(尤其是在系数数量较少的情况下)?(但我想保持函数尽可能通用)
更具体地说,这是我用来应用过滤器的一段代码:
std::deque<double> in(filterNum.size(), 0.0);
std::deque<double> out(filterDenom.size() - 1, 0.0);
const double gain = filterDenom.back();
for (unsigned int s = 0, size = data.size(); s < size; ++s) {
in.pop_front();
in.push_back(data[s] / gain);
data[s] = inner_product(in.begin(), in.end(), filterNum.begin(),
-inner_product(out.begin(), out.end(), filterDenom.begin(), 0.0));
out.pop_front();
out.push_back(data[s]);
}
通常,我使用二阶带通 IIR 滤波器,这意味着filterNum
和filterDenom
(滤波器的分子和分母系数)的大小为 5。data
是包含输入样本的向量。