Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用特征向量对表达式进行矢量化_C++_Vectorization_Eigen - Fatal编程技术网

C++ 使用特征向量对表达式进行矢量化

C++ 使用特征向量对表达式进行矢量化,c++,vectorization,eigen,C++,Vectorization,Eigen,在我的程序中——使用特征库——我需要对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;

在我的程序中——使用特征库——我需要对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。

这个答案与Eigen无关,但是既然您提到了手动下拉到汇编,我将添加这个

您不需要使用汇编来矢量化代码。有一些编译器内部函数可以在无需汇编的情况下手动进行矢量化:


这就是说:看起来Eigen已经有了对矢量化的内部支持,但它似乎不适用于您的示例。所以我可以理解你为什么要手动操作。

这个答案与Eigen无关,但既然你提到了手动下拉到汇编,我将添加这个

您不需要使用汇编来矢量化代码。有一些编译器内部函数可以在无需汇编的情况下手动进行矢量化:

这就是说:看起来Eigen已经有了对矢量化的内部支持,但它似乎不适用于您的示例。所以我可以理解你为什么要手动操作