在我的程序中 - 使用特征库 - 我需要对2D矢量进行操作。在我的内循环中,我有以下功能:
static inline double eval(double x, double y, double xi, double yi)
{
const double invlen2 = 1/(x*x + y*y);
const double invlen4 = invlen2*invlen2;
const double invlen6 = invlen4*invlen2;
const double x2 = x*x, y2 = y*y;
const double x3 = x2*x, y3 = y2*y;
const double xi2 = xi*xi, yi2 = yi*yi;
return x*invlen2 + invlen4*(x2*xi + 2*x*y*yi - xi*y2)
+ invlen6*(x3*xi2 + 3*x*y2*yi2 + 6*x2*y*xi*yi - 3*x*xi2*y2 - 2*y3*xi*yi - x3*yi2);
}
void f(Vector2d& out, const Vector2d& R, const Vector2d& r)
{
out.x() = eval(R.x(), R.y(), r.x(), r.y());
out.y() = eval(R.y(), R.x(), r.y(), r.x());
}
这个表达虽然很混乱,但似乎是矢量化的主要候选者,因为x()
和y()
计算都遵循相同的路径。我的问题是如何使用Eigen,而无需手动下拉到汇编。
答案 0 :(得分:1)
这个答案与Eigen无关,但既然你提到手动下降到汇编,我会加上这个。
您不需要使用程序集来矢量化代码。有编译器内在函数可以在没有汇编的情况下手动进行矢量化:
那就是说:看起来Eigen已经拥有了对矢量化的内部支持,但它似乎并不适用于你的例子。所以我可以看到你为什么要手动完成它。