【发布时间】:2010-05-15 15:50:55
【问题描述】:
假设您要计算项目差异的平方和:
$\sum_{i=1}^{N-1} (x_i - x_{i+1})^2$
最简单的代码(输入为std::vector<double> xs,输出为sum2)为:
double sum2 = 0.;
double prev = xs[0];
for (vector::const_iterator i = xs.begin() + 1;
i != xs.end(); ++i)
{
sum2 += (prev - (*i)) * (prev - (*i)); // only 1 - with compiler optimization
prev = (*i);
}
我希望编译器在上面的评论中做优化。如果N 是xs 的长度,则有N-1 乘法和2N-3 和(sums 表示+ 或-)。
现在假设你知道这个变量:
$x_1^2 + x_N^2 + 2 \sum_{i=2}^{N-1} x_i^2$
并称之为sum。展开二项式平方:
$sum_i^{N-1} (x_i-x_{i+1})^2 = sum - 2\sum_{i=1}^{N-1} x_i x_{i+1}$
所以代码变成:
double sum2 = 0.;
double prev = xs[0];
for (vector::const_iterator i = xs.begin() + 1;
i != xs.end(); ++i)
{
sum2 += (*i) * prev;
prev = (*i);
}
sum2 = -sum2 * 2. + sum;
这里我有 N 次乘法和 N-1 次加法。在我的例子中,N 大约是 100。
好吧,用g++ -O2编译我没有加速(我尝试调用内联函数2M次),为什么?
【问题讨论】:
-
请尝试正确格式化 LaTex 内容。所以支持它。
-
不知何故我怀疑矩阵运算可能会有所帮助。尝试使用 GPU 或对其进行矢量化 :)
-
@Hamish1:你确定吗?如何? @Hamish2:操作的矢量化应该会有所帮助,但现在我只考虑数学计算的简化。
-
您可以尝试查看 gcc 发出的汇编代码,看看它做了哪些优化。 (有一个编译器开关)。胡乱猜测,也许添加的不是你程序的性能瓶颈,例如因为乘法要贵得多?
-
@Hamish:这是正确的 LaTex,但 stackoverflow 不支持它。我认为 mathoverflow 确实...
标签: c++ optimization math floating-point formula