首页 > 解决方案 > 优化特征表达

问题描述

我正在尝试优化此乘法的代码:

A += s * (C + (D-U) * (D-U).transpose());

其中s是标量,C是矩阵(通常为 10x10),DU向量。我试过:

A.noalias() += s * (C + (D-U) * (D-U).transpose());

但我认为阅读文档还不够。在本征中优化此表达式的最佳方法是什么?

标签: c++eigen

解决方案


首先评估D-U一个临时向量,以便它只评估一次,然后,由于您的向量很小,请尝试替换*.lazyProduct(...). 更准确地说,您最终会得到:

auto DU = (D-U).eval();
A.noalias() += s * (C + DU.lazyProduct(DU.transpose()));

当然,您必须准确地对每个更改进行基准测试,并启用完整的编译器优化,以查看它们是否真的有效并且不会适得其反。

最后,如果AC是对称的,您可能会想只更新 A 的一半。这对于大型矩阵(例如,>200x200)是有意义的,但是由于您的矩阵非常小,这将适得其反,因为逻辑开销和更少有效的 SIMD。


推荐阅读